【问题标题】:Expand parameter pack for a function template展开函数模板的参数包
【发布时间】:2018-11-09 16:57:08
【问题描述】:

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

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

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

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

有没有简单的方法来扩展参数包?我试过了:

Func<Inputs>()...;

Func<Inputs>...();

但它们都不起作用。

我只能使用 C++11 :(

【问题讨论】:

  • OP 没有指定 C++11,其他问题是 C++11 问题,不是重复的。
  • @Yakk-AdamNevraumont Variadic 模板参数包至少包含 c++11。
  • @Yakk-AdamNevraumont 请参阅:-(
  • @πάνταῥεῖ 现在它是重复的,以前不是。标签很重要。
  • @Yakk-AdamNevraumont 我的胆量很重要:3

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


【解决方案1】:

有没有简单的方法来扩展参数包?我试过了:

Func&lt;Inputs&gt;()...;

如果你可以使用 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)... };
  }
};

请注意,在这两种情况下,我都在调用 Func&lt;&gt;() 之前添加了 (void)

在你的情况下它是无用的(因为你的 Func&lt;&gt;() 只是返回 void)但它是一种安全带,以防返回重新定义逗号运算符的类的对象的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2020-03-19
    • 2015-05-21
    • 2012-04-09
    • 2013-11-29
    • 2014-10-30
    相关资源
    最近更新 更多