c++ d'une usine automatique de l'enregistrement des types dérivés

Comme beaucoup avant moi, j'essaie donc d'obtenir mon des types dérivés pour enregistrer automatiquement avec mon usine. J'ai lu beaucoup de question et a essayé de se concentrer sur ce que je n'ai pas l'y trouver.

J'ai tout fonctionne bien sauf l'enregistrement automatique.

Mes Objectifs:

  1. enregistrer automatiquement toute classe dérivée de ma classe de base Base
    1. seulement les classes que je marque comme enregistrable
    2. non seulement directe de sous-classes de Base
      • ex: de Base -> Périphérique> Caméra -> Webcam
      • ce serait en utilisant le PFI comme décrit dans cette question dificile
  2. un minimum de changements pour les classes je veux enregistré - les nuls preuve
  3. préférez à l'aide d'un registrator classe que les macros

Ce que j'ai:

template <class T>
class abstract_factory
{
    public:
        template < typename Tsub > static void register_class();
        static T* create( const std::string& name );
    private:
        //allocator<T> is a helper class to create a pointer of correct type
        static std::map<std::string, boost::shared_ptr<allocator<T> > > s_map;
};
  • basé sur un modèle abstrait de l'usine, avec std::string comme type de clé
  • abstract factory a tous les membres et méthodes statique
  • nom de la classe est récupéré automatiquement avec typeid (pas besoin de texte nom lors de l'inscription)
  • enregistrement en appelant: abstract_factory<Base>::register_class<MyDerived>();

Ce que j'ai essayé (ou voudrais, mais ne savez pas comment correctement):

  • registrator<Derived> class: templateded classe est instanciée de façon statique dans Derived.cpp et doit appeler abstract_factory::register_class<Derived>() dans son constructeur
    • n'est jamais appelé ou instancié
    • si je fais une instance de Derived dans main() cela fonctionne -> un peu de défaites le but si
  • déclarer une simple variable statique dans chaque Derived.hpp et le mettre à la statique de la méthode d'enregistrement en Derived.cpp -> encore une fois, n'est jamais appelé.
  • faire abstract_factory un vrai singleton au lieu d'avoir tout ce que statique?

Pourrait utiliser tous les conseils, petits ou grands, merci.

OriginalL'auteur Alex | 2012-04-02