Bonjour, j'essaye d'implémenter un tuple dynamique mais je rencontre un problème, en fait, je n'arrive pas à affecter le bon type pour l'élément du tuple dynamique :
Comme pour les tuples statique je crée une structure Element mais à part que là je n'ai pas de queue étant donné que je ne connais pas le nombre d'éléments à l'avance du tuple, je ne peux pas créer les élément avec un template variadique car ce sont des tuples à un élément, l'index 0 pointe vers le tuple lui même (tuple vide), l'index 1 point vers le 1er élément du tuple, etc..., tout comme std::tuple à part que là comme la taille est variable je défini l'index pour chaque élément du tuple et la taille à la compilation, comme ceci :
Bref voici ma structure Element :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 /**Define an index to a type of an element.*/ template <std::size_t I, class... T> class Element; /**Define the index to the first tuple instance *The type of the tuple and the type of the first element of the tuple are stored. */ template<typename H, std::size_t> class DynamicTuple; template <class H> class Element <0, DynamicTuple<H, 0>> { public : typedef H& Type; typedef DynamicTuple<H, 0> VType; }; template <std::size_t I, class H> class Element<I, DynamicTuple<H, I>> : public Element<I - 1, DynamicTuple<H, I-1> > { };
Et voici ma structure dynamic tuple :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 template <class T, size_t i=0> struct DynamicTuple { public : template <typename A> static void add_element(A element) { typedef typename Element<size+1, DynamicTuple<T, size+1>>::Type A; } static constexpr int getSize() { return size; } private : static constexpr int size = i; };
Le template est juste un type qui sert à identifier le tuple dynamique. (En général c'est la classe qui contient le tuple dynamique)
Le problème est que je lorsque je veux récupérer le type d'un élément, il me renvoie toujours le type de la classe contenant le tuple dynamique et je ne comprend pas pourquoi :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 template <typename L, int I=0, bool B=true> struct get_type { }; template <typename L, int I> struct get_type <L, I, true> { static typename Element<I, L>::Type element (L list, int n) { if (n == 0) return Element<I, L>::Type; constexpr bool isGreater = ((int) (I+1) > DynamicTuple<L, I+1>::getSize()); return get_type<L, I+1, isGreater>::get_type(list, n); } }; template <typename L, int I> struct get_type <L, I, false> { static typename Element<I, L>::type element (L list, int n) { //assert(false); } };
Voilà alors j'aimerais savoir comment lui spécifier que Element<1, DynamicTuple<MaClasse>>::Type est de type A et non pas de type MaClasse.
Et aussi si possible comment instancier cet élément.
Quand j'essaye, j'ai une erreur en compilation. (Vu que type est pas le bon)
Partager