用括号括起来的初始化器列表初始化一个类

本杰明

我正在尝试使用大括号括起来的初始化程序列表初始化类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>'”)

我不明白为什么其中一个初始化应该起作用,而另一个则不起作用。还有其他想法如何使用括号括起来的初始化程序列表,又如何确保编译时的正确长度?

谢谢 :)

Smeeheey

初始化程序列表更适合于列表大小是动态的情况。在您的情况下,其中的大小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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用括号括起来的初始化程序列表初始化结构时出错

从朋友类继承时,无法使用大括号括起来的初始化列表

如何将括号括起来的初始化器列表传递给函数?

将括号括起来的初始化器列表返回为struct

用括号括起的初始化列表调用类的构造函数

用数组初始化一个类?

用数组初始化一个类

用 new 初始化一个 cpp 类

Python初始化一个类中的列表

大括号括起来的初始化程序列表中的左值引用初始化无法编译

用clang中用大括号括起来的列表初始化的char数组中的尾随符号是什么?

大括号括起来的初始化程序列表?转换为矢量

无法从<括号括起来的初始化程序列表>中推导std :: initializer_list

从花括号括起来的列表初始化数组的 C++ 怪异

为什么不能用括号括起来的初始化程序列表构造gsl :: span

无法从括号括起来的初始化程序列表转换为std :: vector

无法从括号括起来的初始化程序列表转换为std元组

无法从括号括起来的初始化程序列表进行转换

具有括号括起来的初始化程序列表的C ++ 11 g ++

线程化一个类成员函数;通过初始化列表进行线程初始化

用花括号初始化一个std :: array的元组

使用构造函数初始化您的类,该构造函数使用带有括号括起来的初始化程序将std :: map作为参数

初始化列表-可以与同一个类的其他成员初始化成员吗?

如何初始化一个类?

如何检查一个类是否被初始化?

从数据行初始化一个类

用零初始化一个arrayList

用一个结构初始化单链表

初始化一个空列表的字典