如何在没有参数包的情况下扩展模式?

时间:2018-06-15 15:11:24

标签: c++ templates variadic-templates

假设我有以下功能模板:

int bar();

template <std::size_t... Is>
void foo()
{
    constexpr auto N = sizeof...(Is);
    int a[N] {/* magic here, like bar()... */};
}

我想用a N s初始化数组bar()。我提出的第一个解决方案如下:

int a[N] {(Is, bar())...};

但它导致一些“表达结果未使用”警告。

LIVE EXAMPLE

如果我不想关闭-Wunused-value标志,怎么能摆脱这些警告?或者还有其他方法可以写N bar()吗?最好不仅解决方案适用于bar(),而且适用于任何不依赖于Is的表达式。

编辑:使用初始化数组只是一个例子。还有许多其他上下文需要这样的表达式序列(例如,用于另一个模板的参数)。所以我真正想要的是如何生成这样的序列而不是初始化数组。

2 个答案:

答案 0 :(得分:3)

此解决方案需要两个步骤,但您可以执行初始化数组,然后使用值std::fill_n执行此操作。

template <std::size_t... Is>
void foo()
{
    constexpr auto N = sizeof...(Is);
    int a[N];
    std::fill_n(a, N, bar());
}

答案 1 :(得分:3)

一种可能的方法是在本地静默警告,作为强制转换为void

int a[N] {(static_cast<void>(Is), bar())...};

Demo