根据模板参数生成不同大小的初始化列表

时间:2018-06-11 20:09:42

标签: c++ templates c++14 variadic-templates initializer-list

我有一个包含对象数组 Error 109 error C2893: Failed to specialize function template 'unknown-type std::less<void>::operator ()(_Ty1 &&,_Ty2 &&) const' 的类,没有默认构造函数。这是一个例子:

T

我正在寻找一种使用包含#include <iostream> struct Param { int x; }; struct A { A(const Param &p) { std::cout << p.x << std::endl; } }; template<class T, int n> struct Array { T data[n]; /* n times */ Array(const Param &p) : data{/* T(p), ..., T(p) */} { } }; int main() { Param p{42}; Array<A, 3> arr(p); return 0; } 个元素的元素data的不同大小初始值设定项列表初始化T(p)字段的方法。我觉得它可以通过像n这样的结构来实现,但我找不到合适的东西。

1 个答案:

答案 0 :(得分:7)

我想您可以使用委托构造函数std::index_sequencestd::make_index_sequence并重写Array,如下所示(编辑:谢尔盖和Rakete1111改进了答案;谢谢!)

template <typename T, std::size_t N>
struct Array
 {
    T data[N];

    template <std::size_t ... Is>
    Array (Param const & p, std::index_sequence<Is...> const &)
       : data { ((void)Is, T{p}) ... }
     { }

    Array(const Param &p) : Array{p, std::make_index_sequence<N>{}}
     { }
 };

也许你可以让private成为新的构造函数。