15

是的,我可以使用std::initializer_list. 是的,更简单的是,我可以进行聚合初始化。但这是如何工作的?我似乎无法绕过 C++17 的折叠表达式。那里没有足够的例子。

这是我想出的:

template<class T, std::size_t N>
struct foo
{
    T arr[N];

    template<typename... Args>
    constexpr foo(Args&&... pack)
    {
        static_assert(sizeof...(pack) <= N, "Too many args");
        std::size_t i = 0;
        (arr[i++] = ...);
    }
};

int main()
{
    foo<int, 5> a(1, 2, 3, 4, 5);
}

编辑:用最新的 Clang 编译。支持折叠表达式。

现场示例: http ://coliru.stacked-crooked.com/a/777dc32da6c54892

4

2 回答 2

14

您需要使用逗号运算符进行折叠,这也解决了排序问题。

(void(arr[i++] = pack) , ...);
于 2016-01-02T19:05:20.460 回答
4

由于逗号运算符是左关联的,因此您最好使用左一元折叠:

(...,void(arr[i++] = pack))

强制转换void为确保使用内置逗号运算符。在这种情况下,惯用手实际上并不重要。

于 2016-01-02T19:12:50.837 回答