我正在编写一个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],但那有点脏...而且不太安全我猜测)
如果你的编译器支持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)