标签:c templates c14 variadic-templates initializer-list
我有一个包含没有默认构造函数的对象数组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;
}
我正在寻找一种方法,使用包含正好n个元素的元素T(p)的不同大小的初始化列表来初始化数据字段.我有一种感觉,它可以通过像std :: make_index_sequence这样的构造来实现,但我找不到合适的东西.
解决方法:
我想你可以使用委托构造函数,std :: index_sequence和std :: make_index_sequence以及重写数组如下(编辑:回答由SergeyA和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>{}}
{ }
};
也许你可以私有新的构造函数.
标签:c,templates,c14,variadic-templates,initializer-list 来源: https://codeday.me/bug/20190731/1587121.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。