代码之家  ›  专栏  ›  技术社区  ›  xskxzr

如何展开没有参数包的模式?

  •  0
  • xskxzr  · 技术社区  · 6 年前

    假设我有以下功能模板:

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

    我想初始化数组 a 具有 N bar() S.我提出的第一个解决方案如下:

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

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

    LIVE EXAMPLE

    如果我不想关闭 -Wunused-value 标志?或者有其他的写作方式吗 N号 巴() S?解决方案不仅适用于 巴() ,也适用于不依赖于 Is .


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

    2 回复  |  直到 6 年前
        1
  •  3
  •   Jarod42    6 年前

    一种可能的方法是在本地静音警告,如强制 void 以下内容:

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

    Demo

        2
  •  3
  •   Cory Kramer    6 年前

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

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