Bonjour à tous,
j'ai déjà eu ce type de "problèmes" mais je pense être maintenant mieux en mesure du comprendre comment le résoudre.
En fait c'est assez simple, et je peux diviser le problème en 3 sous question
1] Est-ce possible d'utiliser l'objet standard std::tuple avec un nombre variable de classes avec le même paramètre template :
exemple : j'ai une classe A template, est-ce possible de créer un objet std::tuple<A<T>,A<U>,...,A<Machin>> avec un nombre de A<...> pouvant varier (selon les désirs de l'utilisateur de la classe)
2] Si ce n'est pas possible, alors on crée une classe tuple "maison" :
par exemple cette classeCette classe MultiDraw... (appelons la A) est simplement un empilement de référence sur d'autres A déjà définis composées à chaque fois d'une classe DrawAnd...(appelons la B) qui constitue la principale raison de ce tuple.
Code : 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
20
21
22
23
24
25
26
27
28
29
30
31 template <typename S, typename ... T> class MultiDrawAndPromptConditionObject; template <typename S> class MultiDrawAndPromptConditionObject<S>; template <typename S, typename End> class MultiDrawAndPromptConditionObject<S, End> { public: MultiDrawAndPromptConditionObject(DrawAndPromptConditionObject<S,End> &obj); std::tuple<End> launch(); protected: DrawAndPromptConditionObject<S,End> &m_obj; }; template <typename S, typename Head, typename ... Args> class MultiDrawAndPromptConditionObject<S,Head,Args...> { public: MultiDrawAndPromptConditionObject(DrawAndPromptConditionObject<S,Head> &obj, MultiDrawAndPromptConditionObject<S,Args...> &encapsuledObj); std::tuple<Head,Args...> launch(); private: DrawAndPromptConditionObject<S,Head> &m_obj; MultiDrawAndPromptConditionObject<S,Args...> &m_encapsuledObj; };
A noter que les références seront prochainement remplacées par des pointeurs intelligents histoire de rendre ça plus propre enfin pour le moment j'attends que ça fonctionne
L'instanciatiation fonctionne comme il faut
Ma question est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 MultiDrawAndPromptConditionObject<const std::vector<std::string> &, int> m1(testHauteur); MultiDrawAndPromptConditionObject<const std::vector<std::string> &, int, int> m2(testLargeur,m1); MultiDrawAndPromptConditionObject<const std::vector<std::string> &, std::string, int, int> m3(promptStr,m2);
Cette instanciation est lourde et l'est de plus en plus. Y aurait-il un moyen d'instancier le même objet m3 ci-dessus juste en déclarant quelque chose du type :
Mon instinct me soufflerait que oui (enfin faut pas être très doué pour penser que c'est possible ^^) après je ne vois pas comment faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part MultiDrawAndPromptConditionObject<const std::vector<std::string> &, std::string, int, int> m3 = makeMultiMachin(promptStr,testHauteur,testLargeur);
3] Cette question concerne un aspect "pratique" des tuples qui fait que ma classe ne compile pas encore :
Voici ma fonction launch dans le cas de la classe A la plus "générale" :
Dans ma fonction Launch qui retourne un tuple et qui ne marche bien sur pas ce qui est tout à fait prévisible puisque m_encapsuledObj.launch() retourne un tuple de <a,b,...,> au lieu de retourner quelque chose du type a,b,....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template <typename S, typename Head, typename ... Args> std::tuple<Head,Args...> MultiDrawAndPromptConditionObject<S, Head, Args...>::launch() { return std::make_tuple(m_obj.launch(),m_encapsuledObj.launch()); }
Ma question est la suivante : comment découper un tuple pour pouvoir placer son contenu dans un autre tuple avec un autre élément devant le contenu du tuple (c'est pas très bien expliqué mais en fait ça consiste simplement à expliquer comment résoudre le problème posé par le code ci-dessus)
Voilà j'espère que vous arriverez à comprendre ce que j'exprime souvent avec difficultés
Partager