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