Question

J'ai une structure définie comme suit:

template <typename T> 
struct data {
  int num;
  T *ptr;
};

Je souhaite créer une liste STD :: de diverses structures de données en utilisant différents types comme:

struct data<My_Favorite_Type> a;
struct data<My_Second_Favorite_Type> b;

Je ne sais tout simplement pas s'il est possible de déclarer une liste std :: qui accepte ces deux structures. La création d'une liste STD :: de ces éléments est-elle possible? En tant que solution de contournement, je pense que je pourrais faire de ma structure une liste liée générique, mais j'aimerais vraiment utiliser la bibliothèque STD si possible.

Était-ce utile?

La solution

Les types stockés à l'intérieur des conteneurs STD doivent être uniformes. Vous ne pouvez donc pas faire ceci:

std::list<data> some_data;
some_data.push_back(data<int>());
some_data.push_back(data<float>());

Parfois, avoir deux listes est la bonne solution. :)

Il existe quelques autres façons de penser au problème, bien qu'il soit difficile de dire s'ils sont appropriés pour vous.

Ils peuvent être des pointeurs et gérés dynamiquement. Dans cet exemple, peu importe les données, nous voulons simplement les imprimer.

struct base {
  virtual ~base() {}
  virtual void print() const = 0;
};

template<typename T>
  struct data : public base {
    virtual void print() const {std::cout << num << std::endl;}
    int num;
    T *ptr;
  };

std::list<base *> some_data;

Vous pouvez aussi utiliser boost::variant.

typedef boost::variant<
    data<int>
    ,data<float>
  > data_variant;

std::list<data_variant> some_data;

L'autre outil qui rend les variantes Pleasant est boost::static_visitor.

Autres conseils

Non, ce que vous cherchez à faire n'est pas possible, mais vous pouvez y arriver avec un peu de travail supplémentaire si vous utilisez quelque chose comme boost::any.

La réponse verbale est "non, ce n'est pas possible" (et non verbeux est trop court pour une réponse).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top