很好地初始化结构的联合

时间:2011-08-28 00:14:36

标签: c++ struct unions

我正在编写一个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],但这有点脏...而不是这么安全我猜)

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。