OVH Cloud OVH Cloud

Conteneur heterogene

12 réponses
Avatar
Frédéric Mayot
Bonjour,

Soit une classe template Contenu :

template <typename T>
class Contenu {T t;};

Je cherche à réaliser une classe Conteneur pour des objets Contenu avec
des paramètres de template différents.

A présent, j'ai écrit ceci :

class Base{};

template <typename T>
class Contenu : public Base {T t;};

class Conteneur
{
protected:
std::vector<Base> objets;
public:
template <typename T>
void ajoute(T& b) {objets.push_back(b);}
Base& get(int pos) {return objets[pos];}
};

int main(int argv, char** argc)
{
Conteneur mon_conteneur;
Contenu<int> mon_contenu;
mon_conteneur.ajoute(mon_contenu);

// OK
Base& b = mon_conteneur.get(0);

// ERREUR
Contenu<int>& c =
static_cast<Contenu<int> >(mon_conteneur.get(0));

return 1;
}

Bien sûr, ça ne marche pas puisque je ne peux retrouver le type
d'origine. Je vois comment faire avec une alternative "dynamique",
mais en statique, je ne vois pas.

Merci.

Fred

2 réponses

1 2
Avatar
Benoit Dejean
Le Wed, 10 Dec 2003 10:43:18 +0100, Frédéric Mayot a écrit :

Bonjour,

Soit une classe template Contenu :

template <typename T>
class Contenu {T t;};

Je cherche à réaliser une classe Conteneur pour des objets Contenu avec
des paramètres de template différents.


quelqu'un a conseillé boost::any<> ?
www.boost.org

Avatar
Loïc Joly
Marc Boyer wrote:

Frédéric Mayot wrote:

Bien sûr, ça ne marche pas puisque je ne peux retrouver le type
d'origine. Je vois comment faire avec une alternative "dynamique",
mais en statique, je ne vois pas.



Disons qu'il y a à mon humble avis un problème de
conception. C++ est un système à typage statique, qui
offre un certain polymorphisme dynamique à travers
des références ou des pointeurs uniquement.

Vouloir mettre dans un conteneur STL des données
de type différent sans utiliser de pointeur ou
de référence, c'est comme vouloir planter une vis
avec un clou. On doit pouvoir y arriver, mais à quel
prix, et en se tapant souvent sur les doigts avant
d'y arriver.


Oui, c'est encore plus difficile que si on avait un marteau, et puis, ou
doit avoir moins de force aussi... ;)


Au fait, pourquoi ne pas faire un conteneur avec
des références ? Le coût de l'indirection serait
vraiment prohibitif ?


Parce qu'une référence n'est pas un candandidat admissible pour un
conteneur STL ?

--
Loïc


1 2