Мне интересно, может ли кортеж быть инициализирован списком инициализаторов (точнее - initializer_list из initializer_lists)? Учитывая определение кортежа:
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}} };
Я просто хочу достичь той же функциональности, которую я получил, используя struct вместо кортежа (таким образом, 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, и в обёртывание массивов правильным конструктором задача не из легких.
Списки инициализаторов не имеют отношения к кортежам.
Думаю, вы путаете два разных использования фигурных скобок в C ++ 0x.
initializer_list
- однородная коллекция (все элементы должны быть одного типа, поэтому не имеет отношения к std :: tuple
) Вот упрощенная версия:
std::tuple<int, char> t = { 1, '1' };
// error: converting to 'std::tuple<int, char>' from initializer list would use
// explicit constructor 'std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&)
// [with _U1 = int, _U2 = char, _T1 = int, _T2 = char]'
std::tuple<int, char> t { 1, '1' }; // note no assignment
// OK, but not an initializer list, uniform initialization
В сообщении об ошибке говорится, что вы пытаетесь неявно вызвать конструктор, но это явный конструктор, поэтому ты не можешь.
В основном вы пытаетесь сделать что-то вроде этого:
struct A {
explicit A(int) {}
};
A a0 = 3;
// Error: conversion from 'int' to non-scalar type 'A' requested
A a1 = {3};
// Error: converting to 'const A' from initializer list would use
// explicit constructor 'A::A(int)'
A a2(3); // OK C++98 style
A a3{3}; // OK C++0x Uniform initialization