繁体   English   中英

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

[英]How to expand a pattern without parameter pack?

假设我有以下功能模板:

int bar();

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

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

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

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

现场例子

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


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

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

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

一种可能的方法是在本地将警告静音,因为将其强制转换为void

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

演示版

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM