pgl10
Messages postés380Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention29 octobre 202311 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és3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 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és3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 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:
9 janv. 2012 à 18:25
9 janv. 2012 à 12:30
- 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.
9 janv. 2012 à 12:21
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;
}