C++ автоматическая регистрация производных типов в фабрике

Как и многие до меня, я стараюсь, чтобы мои производные типы автоматически регистрировались в моей фабрике. Я прочитал много вопросов и попытался сосредоточиться на том, чего я там не нашел.

У меня все работает нормально, кроме автоматической регистрации.

Мои цели:

  1. автоматически регистрируют любой производный класс моего базового класса Базовый
    1. только классы, которые я помечаю как регистрируемые
    2. не только прямые под-классы Базового
      • например:База -> Устройство -> Камера -> Веб-камера
      • это сделало бы использование CRTP , как описано в , этот вопрос сложно
  2. минимальные изменения в классах, которые я хочу зарегистрировать-фиктивное доказательство
  3. предпочел бы использовать класс регистратора , а не макросы

Что у меня есть:

template 
class abstract_factory
{
    public:
        template < typename Tsub > static void register_class();
        static T* create( const std::string& name );
    private:
        // allocator is a helper class to create a pointer of correct type
        static std::map > > s_map;
};
  • шаблонная абстрактная фабрика, с std::строка как тип ключа
  • абстрактная фабрика имеет все элементы и методы статическое
  • имя класса восстанавливается автоматически с идентификатором типа(нет необходимости в текстовом имени при регистрации)
  • регистрация путем вызова:abstract_factory::register_class();

То, что я пробовал (или хотел бы сделать, но не знаю, как правильно):

  • registrator class:шаблонный класс, который создается статически в Derived.cppи должен вызывать abstract_factory::register_class()в своем конструкторе
    • никогда не вызывается и не создается экземпляр
    • если я создаю экземпляр Derivedв main()это работает -> вроде как противоречит цели, хотя
  • объявить простую статическую переменную в каждом Derived.hppи установить он со статическим методом регистрации в Derived.cpp-> снова никогда не вызывается.
  • сделать abstract_factoryнастоящим синглтоном вместо того, чтобы все было статично?

Буду рад любому совету, большому или маленькому, спасибо.

16
задан Community 23 May 2017 в 12:25
поделиться