Разверните пакет параметров для шаблона функции - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть шаблон функции, как показано ниже. Аргумент шаблона должен быть указан явно.

template<typename T>
void Func() {...};

Мне нужно вызывать эту функцию для каждого типа в пакете параметров:

template<typename... Inputs>
struct SetStruct{
  void Set() {
    // Call Func() here
  }
};

Есть ли простой способ расширить пакет параметров? Я попробовал:

Func<Inputs>()...;

и

Func<Inputs>...();

Но ни один из них не работает.

Я могу использовать только C ++ 11: (

1 Ответ

0 голосов
/ 09 ноября 2018

Есть ли простой способ расширить пакет параметров? Я попробовал:

Func<Inputs>()...;

Если вы можете использовать C ++ 17, используя оператор запятой и свертывание шаблона

((void)Func<Inputs>(), ...);

В C ++ 11 / C ++ 14, снова используя оператор запятой, но в контексте инициализации неиспользуемого массива в стиле C, что-то вроде следующего:

template<typename... Inputs>
struct SetStruct{
  void Set() {
    using unused = int[];

    (void)unused { 0, ((void)Func<Inputs>(), 0)... };
  }
};

Заметьте, что в обоих случаях я добавил (void) перед вызовом Func<>().

В вашем случае это бесполезно (потому что ваш Func<>() просто возвращает void), но это своего рода пояс безопасности в случае функции, которая возвращает объект класса, который переопределяет оператор запятой.

...