扩展功能模板的参数包

时间:2018-11-09 16:57:09

标签: c++ c++11 templates variadic-templates template-meta-programming

我有一个如下的功能模板。模板参数需要明确给出。

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

我需要为参数包中的每种类型调用此函数:

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

是否有简单的方法来扩展参数包?我尝试过:

Func<Inputs>()...;

Func<Inputs>...();

但是它们都不起作用。

我只能使用C ++ 11:(

1 个答案:

答案 0 :(得分:5)

  

是否有简单的方法来扩展参数包?我尝试过:

     

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),但是在函数返回返回重新定义逗号运算符的类的对象的函数的情况下,它是一种安全带。 / p>