Ответ 1
bar(((void)N_i, 0)...);
Оператор запятой отбрасывает N_i
, что дает только правое значение операнда (0
). Приведение должно предотвращать отбрасывание предупреждения о N_i
.
У меня есть следующая проблема:
template< size_t... N_i >
class A
{
public:
// ...
void foo()
{
bar( /* 0,...,0 <- sizeof...(N_i) many */);
}
};
Я хочу вызвать функцию bar
и передать sizeof...(N_i)
множество аргументов, которые являются всеми нулями, например, bar(0,0,0)
в случае sizeof...(N_i) == 3
.
Как это можно реализовать?
bar(((void)N_i, 0)...);
Оператор запятой отбрасывает N_i
, что дает только правое значение операнда (0
). Приведение должно предотвращать отбрасывание предупреждения о N_i
.
Несмотря на то, несомненно, интересный Ответа на этот вопрос @Columbo, я хочу предложить еще один жизнеспособный решение, основанное на constexpr
'переменных шаблона D:
#include <cstddef>
template<std::size_t, std::size_t V>
constexpr std::size_t repeat_value = V;
template<std::size_t... N_i>
class A {
template<typename... Args>
void bar(Args&&...) { }
public:
void foo() {
// repeat N_i times value 0
bar(repeat_value<N_i, 0>...);
}
};
int main() {
A<0, 1, 2, 3, 4> a;
a.foo();
}
Мне легче читать хотя бы, даже если это плохо с точки зрения производительности во время компиляции.
Вы можете легко обобщить его следующим образом:
template<std::size_t, typename T, T V>
constexpr T repeat_value = V;
В этом случае invokation в этом случае:
bar(repeat_value<N_i, int, 0>...);
Вы также можете использовать шаблоны для имитации чего-то подобного. Это очень простое решение и просто создаст список 0s, но его можно расширить, чтобы генерировать другие последовательности, если это было необходимо.
template <size_t Unused>
struct Wrap {
static constexpr size_t value = 0;
};
template <size_t... N_i>
class A {
public:
void foo() {
bar(Wrap<N_i>::value...);
}
};
который будет просто расширяться в список нулей такого же размера, что и аргументы N_i. По общему признанию, интерфейс немного отличается.
В качестве полного примера, который показывает значения элементов, которые получает панель, см. здесь: Пример в реальном времени