很好地初始化结构的联合

Zon*_*nko 1 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; };    
    };
};
Run Code Online (Sandbox Code Playgroud)

然后,由于我没有ctor,我想像这样初始化它:

Vec3_t<int> v = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

但我已经把双括号因为我在结构中初始化一个结构(像这样的:Vec3_t<int> v = {{1, 2, 3}})

所以,我的问题是:我怎么能这样做,以便我可以使用不同的名称进行访问,并使用一对大括号进行初始化?

我的尝试:为每个组件设置一个联合,但随后以访问作为表退出(一个人总是可以调用&v.x并将其视为一个浮点数[3],但那有点脏...而且不太安全我猜测)

Set*_*gie 5

如果你的编译器支持C++ 11的这个特性,你可以创建一个构造函数,它需要一个std::initializer_list(我知道你说你不想要一个构造函数,但是这个解决方案需要一个[但是我认为它不会导致如果你有优化的话,性能会受到影响,抱歉):

Vec3_t(std::initializer_list<T> list) : val(list) { }
Run Code Online (Sandbox Code Playgroud)

然后你可以构建一个Vec3_t你想要的:

Vec3_t<int> v = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)