我正在尝试使用大括号括起来的初始化程序列表初始化类Vec,在此最小示例中将其调用为:
int main()
{
Vec<3> myVec1{{1,2,3}}; // or: myVec1({1,2,3});
Vec<3> myVec2;
myVec2 = {1, 2, 3};
Vec<3> myVec3 = {1,2,3};
return 0;
}
所有这些初始化(和分配)都应该起作用。(加上自定义默认构造函数。因此,不可能使用聚合类。)
虽然我可以像这样使用std :: initializer_list:
template <unsigned C>
struct Vec
{
Vec(){}
Vec(std::initializer_list<int> list)
{
//does not work for obvious reasons:
//static_assert(list.size() == C, "");
}
};
我不能静态地确保参数的数量等于我的模板参数,即,使用{1、2、3、4}进行的初始化只会在运行时失败。
浏览SO,我想到了以下内容:
template <unsigned C>
struct Vec
{
Vec(){}
Vec(const unsigned(&other)[C]){}
Vec& operator=(const unsigned(&other)[C]){return *this;}
};
这对于分配和()或{}初始化(对于myVec1而言)工作正常-但对于使用=的初始化(对于myVec3而言)则失败。
(GCC给出错误“无法将'{1,2,3}'从”转换为'Vec <3u>'”)
我不明白为什么其中一个初始化应该起作用,而另一个则不起作用。还有其他想法如何使用括号括起来的初始化程序列表,又如何确保编译时的正确长度?
谢谢 :)
初始化程序列表更适合于列表大小是动态的情况。在您的情况下,其中的大小Vec
是模板参数(即静态),则最好使用可变参数:
template <unsigned C>
struct Vec
{
Vec(){}
template<typename ... V>
Vec(V ... args)
{
static_assert(sizeof...(V) == C, "");
//...
}
};
那么这些将起作用:
Vec<3> myVec2;
myVec2 = {1, 2, 3};
Vec<3> myVec3 = {1,2,3};
但这并不需要,因为它明确要求std::initializer_list
:
Vec<3> myVec1{{1,2,3}};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句