2011-08-28 70 views
1

我正在编写一个Vec3类,并为了优化目的,我没有构造函数。 我也希望能够以x,y,z或者r,g,b或者OR作为标签访问其成员。 容易,你可能会想:使用工会初始化结构的联合很好

template <typename T> struct Vec3_t  
{  
    union  
    { 
     T val[3];  
     struct { T x, y, z; };  
     struct { T r, g, b; };  
    }; 
}; 

然后,因为我没有男星,我想初始化它是这样的:

Vec3_t<int> v = {1, 2, 3}; 

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

所以,我的问题是:我怎么能做到这一点,这样我可以有不同的名称都访问,并与初始化1对大括号?

我的尝试:每个组件都有一个联合,但随后以access作为表退出(可以始终调用& vx并将其视为浮点[3],但这有点脏......而不是所以我想是安全的)

+3

不成熟的优化是万恶之源。这是一个模板类,所以构造函数的源将在编译时可用。大多数现代编译器将使用所有这些信息来生成最优代码。节省一些时间并写一个构造函数。 –

+0

其实,我不想要一个ctor,所以当我做一个'新的Vec3_t [x]'时,什么都不会被调用。但我做了一个小测试,似乎有一个空的默认ctor允许相同的...我想我会去ctor。 – Zonko

+0

@Zonko如果我的答案在下面解决了你的问题,请你点击它旁边的复选标记(就在上下箭头的下方),将其标记为答案? –

回答

1

没有构造函数就无法完成它,不惜一切代价避免使用ctor是一个坏主意。

5

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

Vec3_t(std::initializer_list<T> list) : val(list) { } 

然后你可以construc吨Vec3_t像你想:

Vec3_t<int> v = {1, 2, 3}; 
+0

如果你允许一个构造函数,你可以让它接受'Vec3_t v(1,2,3);'...... –

+0

@Kerrek true。我不知道他为什么不想要构造函数,但这样简单的代码不会比初始化数组慢吗? –

+0

这并不回答这个问题:你用ctor解决问题。正如Kerrek所说,如果你使用ctor,你可以使其“正常”。 – Zonko

0

你可以得到初始化类没有构造函数最接近的是使用三个预定义的对象。每一个初始化为您打算使用的一种工会类型。将所需类型之一分配给您正在创建的新对象。

T t1;// array 
T t2;// xyz 
T t3;// rgb 

T newT = t1; 

这就是说,真的很难想象为什么你不能拥有Ctor,除了你不想要它的原因之外。