J'ai un design où j'ai un std::list
de pointeurs de base que je voudrais transformer en une liste parallèle qui ajoute un comportement. Le problème que j'ai est que l'objet que j'essaie d'utiliser pour faire la transformation ne sait pas quels sont les types réels quand il est appelé.Transformer une liste de pointeurs en classe de base
Il est tout à fait possible qu'il me manque quelque chose de subtil et qu'il y a une solution facile. Cependant, si c'est un défaut de conception (j'ai vu cela suggéré dans d'autres articles), quelle est la meilleure façon d'aborder cela?
Supposons que le texte suivant:
class Sprite { /* ... */ };
class Character : public Sprite {};
class Markup : public Sprite {};
Ceux-ci sont réalisés (par rapport à une certaine entrée) dans un std::list< Sprite * >
. Ce que je voudrais faire, c'est finalement prendre la liste et la transformer en une structure parallèle adaptée aux opérations de sortie. Par exemple, étant donné:
class HTMLSprite { /* ... */ };
class HTMLCharacter : public HTMLSprite {};
class HTMLMarkup : public HTMLSprite {};
Je voudrais idéalement faire quelque chose comme
std::transform(sprites.begin(), sprites.end(), html.begin(), HTMLConvert);
avec quelque chose comme
struct HTMLConvert_ {
HTMLSprite * operator() (const Character * c) { return new HTMLCharacter(); }
HTMLSprite * operator() (const Markup * c) { return new HTMLMarkup(); }
} HTMLConvert;
Maintenant, je reçois l'erreur
call of `(HTMLConvert) (const Sprite* const&)' is ambiguous
HTMLSprite* HTMLConvert::operator()(const Character*) const <near match>
Ce qui m'amène à ma question n. Quelle est la meilleure solution à ce problème - refonte ou autre?
Merci.
Problème classique pour le modèle de visiteur. – Omnifarious