38
我想知道元組是否可以通過初始化列表進行初始化(更確切地說 - initializer_list的initializer_list)?考慮到元組的定義:初始化從初始化列表中的std ::元組
typedef std::tuple< std::array<short, 3>,
std::array<float, 2>,
std::array<unsigned char, 4>,
std::array<unsigned char, 4> > vertex;
有以下這樣做的任何方式:
static vertex const nullvertex = { {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
我只是想實現我使用結構,而不是元組相同的功能(因此只陣列由initializer_list初始化):
static struct vertex {
std::array<short, 3> m_vertex_coords;
std::array<float, 2> m_texture_coords;
std::array<unsigned char, 4> m_color_1;
std::array<unsigned char, 4> m_color_2;
} const nullvertex = {
{{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}}
};
沒有理由我必須使用元組,只是想知道。我問,因爲我無法通過由我嘗試這種元組初始化生成的g ++模板錯誤。
@Motti:所以我錯過了統一初始化的正確語法 -
static vertex const nullvertex = vertex{ {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
和
static vertex const nullvertex{ {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
但似乎所有的麻煩在於陣列,其中有沒有構造函數initializer_list和用合適的構造函數包裝數組似乎不是那麼容易的任務。
感謝您的答覆! – erjot 2010-08-06 09:06:58
爲什麼用一個加載的init列表構造一個'std :: tuple'是一件壞事?它適用於'std :: pair's,'std :: tuple'是'std :: pair'的泛化,所以我不明白這個限制的原因:S ... – rubenvb 2012-08-28 19:36:02
@rubenvb可以用統一的初始化(大括號)初始化一個'元組',但要做到這一點,你必須刪除等號。如果你有一個等號,這意味着你使用一個參數構造函數構造一個臨時接受一個初始化列表,然後從臨時值中使用複製構造函數(儘管編譯器可以省略其中的一部分)。 – Motti 2012-08-29 07:50:22