我正在编写一个Vec3类,为了优化,我没有构造函数。 我还希望能够以x,y,z OR为r,g,b OR作为选项卡访问其成员。 很容易,你可能会想:使用联盟
template <typename T> struct Vec3_t
{
union
{
T val[3];
struct { T x, y, z; };
struct { T r, g, b; };
};
};
然后,由于我没有ctor,我想像这样初始化它:
Vec3_t<int> v = {1, 2, 3};
但是因为我在结构中初始化一个结构,所以我必须加上双括号(例如:Vec3_t<int> v = {{1, 2, 3}}
)
所以,我的问题是:我怎么能这样做,以便我可以同时使用不同的名称进行访问,并使用一对大括号进行初始化?
我的尝试:每个组件都有一个联合,但随后以表格的形式退出(一个人可以随时调用&amp; vx并将其视为一个浮点数[3],但这有点脏...而不是这么安全我猜)
答案 0 :(得分:5)
如果你的编译器支持C ++ 11的这个特性,你可以创建一个带std::initializer_list
的构造函数(我知道你说你不想要一个构造函数,但这个解决方案需要一个[但是如果你有优化的话,我认为它根本不会导致性能损失,抱歉):
Vec3_t(std::initializer_list<T> list) : val(list) { }
然后你可以像你想要的那样构建一个Vec3_t
:
Vec3_t<int> v = {1, 2, 3};
答案 1 :(得分:1)
没有构造函数就无法做到,不惜一切代价避免使用ctor是个坏主意。
答案 2 :(得分:0)
在没有Ctor的情况下,最接近初始化类的方法是使用三个预定义对象。每一个都初始化为您打算使用的一种类型的联合。将所需种类之一分配给您正在创建的新对象。
T t1;// array
T t2;// xyz
T t3;// rgb
T newT = t1;
那就是说,除了你不想要的原因之外,很难想象为什么你不能拥有Ctor。