我在想元组是否可以通过初始化列表来进行初始化(更准确地说,通过初始化列表的初始化列表)?考虑到元组的定义:
有没有办法做到以下的事情:
我只是想通过使用结构体而不是元组来实现相同的功能(因此只有数组通过初始化列表进行初始化)。
没有理由我必须使用元组,只是好奇而已。我问这个问题是因为我无法解决由我尝试初始化元组而产生的g++模板错误。
@Motti:所以我错过了统一初始化的正确语法。
但似乎所有的麻烦都在于数组,它们没有初始化列表的构造函数,而且用适当的构造函数包装数组似乎并不是一件容易的任务。
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}} };
我只是想通过使用结构体而不是元组来实现相同的功能(因此只有数组通过初始化列表进行初始化)。
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}} };
但似乎所有的麻烦都在于数组,它们没有初始化列表的构造函数,而且用适当的构造函数包装数组似乎并不是一件容易的任务。
std::tuple
为什么是不好的事情?这种方法对于std::pair
有效,并且std::tuple
是std::pair
的推广,因此我不理解这种限制的原因:S... - rubenvbT t = x;
时,它要求T
有一个可访问的隐式构造函数,接受x
并具有可访问的复制构造函数。一旦确定t
可以从临时T
构造,编译器就可以省略临时变量,否则它不应该编译。 - Mottistd::tuple<int, char> t = { 1, '1' };
不好,因为std::tuple<int, char> t = { (int)1, (char)'1' };
仍然会生成相同的错误。正如这里所解释的那样,错误消息是在此处生成的,因为元组没有接受初始化列表作为tuple constructor的构造函数。 - writalnaie