Je me demande si le tuple peut être initialisé par la liste d'initialisation (pour être plus précis - par initializer_list de initializer_lists)? Compte tenu de la définition de tuple:Initialisation de std :: tuple à partir de la liste d'initialisation
typedef std::tuple< std::array<short, 3>,
std::array<float, 2>,
std::array<unsigned char, 4>,
std::array<unsigned char, 4> > vertex;
est-il possible de faire ce qui suit:
static vertex const nullvertex = { {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
Je veux juste obtenir même fonctionnalité que je suis arrivé à l'aide struct au lieu de tuple (sont initialisés tableaux ainsi que par 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}}
};
Il n'y a aucune raison pour laquelle je dois utiliser des tuples, je me demandais simplement. Je demande, parce que je suis incapable de passer par des erreurs g ++ modèles qui sont générés par ma tentative d'une telle initialisation de tuple.
@Motti: Je manqué la syntaxe correcte pour l'initialisation uniforme -
static vertex const nullvertex = vertex{ {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
et
static vertex const nullvertex{ {{0, 0, 0}},
{{0.0, 0.0}},
{{0, 0, 0, 0}},
{{0, 0, 0, 0}} };
Mais il semble que tout le problème réside dans les tableaux, qui ont obtenu aucun constructeur pour initializer_list et Envelopper les tableaux avec un constructeur approprié ne semble pas si facile.
Merci pour la réponse! – erjot
Pourquoi la construction d'un 'std :: tuple' avec une liste init braced est-elle une mauvaise chose? Cela fonctionne pour 'std :: pair's, et un' std :: tuple' est la généralisation de 'std :: pair', donc je ne comprends pas la raison de cette limitation: S ... – rubenvb
@rubenvb il est possible d'initialiser un 'tuple' avec une initialisation uniforme (accolades) mais pour ce faire, vous devez supprimer le signe égal. Si vous avez un signe égal, cela signifie que vous construisez un temporaire avec le constructeur à un paramètre acceptant une liste d'initialisation, puis utilisez le constructeur de copie à partir de la valeur temporaire (bien que le compilateur puisse en éluder une partie). – Motti