Подтвердить что ты не робот

Генерация последовательности нулей во время компиляции

У меня есть следующая проблема:

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. Как это можно реализовать?

4b9b3361

Ответ 1

bar(((void)N_i, 0)...);

Оператор запятой отбрасывает N_i, что дает только правое значение операнда (0). Приведение должно предотвращать отбрасывание предупреждения о N_i.

Ответ 2

Несмотря на то, несомненно, интересный Ответа на этот вопрос @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>...);

Ответ 3

Вы также можете использовать шаблоны для имитации чего-то подобного. Это очень простое решение и просто создаст список 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. По общему признанию, интерфейс немного отличается.

В качестве полного примера, который показывает значения элементов, которые получает панель, см. здесь: Пример в реальном времени