UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 9 janv. 2012 à 12:21
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 - 9 janv. 2012 à 18:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53959-une-liste-heterogene-doublement-chainee

pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
9 janv. 2012 à 18:25
CptPingu : Merci d'avoir montré que la STL avec std::list permet de construire une liste doublement chainée avec des maillons de type différent d'un maillon à l'autre. Je ne le savais pas. Plusieurs solutions valent mieux qu'une seule. Et cela permet aussi de choisir en fonction des besoins de chacun.
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 janv. 2012 à 12:30
Soit dit en passant, il est possible d'obtenir ce comportement en utilisant:
- std::list (tout types)
ou
- std::list (types sélectionnés)

Mais il est vrai qu'il faut ajouter une dépendance supplémentaire. Je le signale juste pour ceux qui incluraient déjà la bibliothèque boost dans leurs projets.
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 janv. 2012 à 12:21
Bonjour.

Le code est parfaitement portable (à part le system("pause"), mais ce n'est pas grave du tout). D'une manière générale, tant qu'on utilise pas des appels systèmes, les chances de rester portable sont grandes :)

Je te propose une version utilisant purement la STL. Il y a donc un peu moins de code:

#include
#include <list>

class GenericNode
{
public:
virtual const std::string& type() const = 0;
virtual void print(std::ostream& out) const = 0;
virtual ~GenericNode()
{
}
};

template <typename T>
class Node : public GenericNode
{
public:
Node(const std::string& type, T value)
: type_(type), value_(value)
{
}

virtual const std::string& type() const
{
return type_;
}

T value() const
{
return value_;
}

virtual void print(std::ostream& out) const
{ out << "value_ " << value_ << ", type " << type_;
}

virtual ~Node()
{
}

private:
const std::string type_;
T value_;
};

std::ostream& operator<<(std::ostream& out, const GenericNode* node)
{
node->print(out);
return out;
}

#define NODE(Type,Value) new Node<Type>(#Type, Value)

int main()
{
typedef std::list<GenericNode*> list_type;
typedef typename list_type::const_iterator list_iter;

list_type list;
list.push_back(new Node("int", 30));
list.push_back(new Node<double>("double", 30.5));
list.push_back(new Node<std::string>("std::string", "String example"));

list.push_back(NODE(std::string, "Simplifed by macro"));

int i = 1;
for (list_iter it = list.begin(); it != list.end(); ++it, ++i)
std::cout << i << ": " << *it << std::endl;

std::cout << "List size: " << list.size() << std::endl
<< "First type: " << list.front()->type()
<< ", First value: " << static_cast<Node*>(list.front())->value() << std::endl;

return 0;
}
Rejoignez-nous