2011-08-28 73 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,除了你不想要它的原因之外。