Zastanawiam się, czy krotka może być zainicjalizowana przez listę inicjalizującą (a dokładniej - przez initializer_list of initializer_lists)? Biorąc pod uwagę definicję krotka:Inicjalizacja std :: tuple z listy inicjalizatora
typedef std::tuple< std::array<short, 3>,
std::array<float, 2>,
std::array<unsigned char, 4>,
std::array<unsigned char, 4> > vertex;
jest jakiś sposób, wykonując następujące czynności:
static vertex const nullvertex = { {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
Chcę tylko, aby osiągnąć tę samą funkcjonalność dostałem użyciu struct zamiast krotki (a więc tylko tablice są inicjowane przez 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}}
};
Nie ma powodu, dla którego muszę używać krotek, tylko się zastanawiam. Pytam, ponieważ nie jestem w stanie przejść przez błędy w szablonach g ++, które są generowane przez moją próbę zainicjowania takiej krotki.
@Motti: Więc brakowało właściwej składni jednolitej inicjalizacji -
static vertex const nullvertex = vertex{ {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
i
static vertex const nullvertex{ {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
Ale wydaje się, że cały problem polega na tablicach, które dostali żadnego konstruktora dla initializer_list i pakowanie tablic z odpowiednim konstruktorem nie wydaje się tak łatwym zadaniem.
Dziękuję za odpowiedzi! – erjot
Dlaczego konstruowanie 'std :: tuple' ze stężoną listą init jest złe? Działa dla 'std :: pair's, a' std :: tuple' jest uogólnieniem 'std :: pair', więc nie rozumiem powodu tego ograniczenia: S ... – rubenvb
@rubenvb można zainicjować 'krotkę' z jednolitą inicjalizacją (nawiasy klamrowe), ale aby to zrobić, musisz upuścić znak równości. Jeśli masz znak równości, oznacza to, że tworzysz tymczasowy z jednym konstruktorem parametrów akceptującym listę inicjalizacyjną, a następnie używasz konstruktora kopiowania z wartości tymczasowej (chociaż kompilator może to znieść). – Motti