Шаблоны C variadic: элегантный способ перечисления всех элементов массива в зависимости от размера шаблона variadic

#c #variadic-templates

#c #variadic-шаблоны

Вопрос:

Есть ли какой-нибудь элегантный способ выразить вызов функции в зависимости от некоторых n , которые могут быть получены из аргументов шаблона

 f(my_array[0], ... , my_array[n-1]);
  

внутри шаблона класса, который выглядит так?:

 template <int... numbers>
class Abraham {
   static constexpr std::size_t n = sizeof...(numbers);
   some_type my_array[n];

   void foo(){
   //...
   f(my_array[0], ... , my_array[n-1]); // This line is no valid C   Code. How can one achieve this in an elegant way?
   //...
   }
}
  

Комментарии:

1. Для чего numbers используется, если вы используете только размер пакета параметров в этом примере?

2. @parktomatomi Это просто сокращенная версия исходного кода, чтобы получить минимальный пример. (Числа будут использоваться независимо от массива)

Ответ №1:

Стандартная библиотека std::index_sequence предназначена для такого рода вещей

 template <size_t... Is>
void foo(std::index_sequence<Is...>) {
  f(my_array[Is]...);
}
void foo() {
  foo(std::make_index_sequence<n>{});
}
  

Демонстрация: https://godbolt.org/z/zhbGdb