Как и многие до меня, я стараюсь, чтобы мои производные типы автоматически регистрировались с помощью моего factory. Я прочитал много вопросов и попытался сосредоточиться на том, чего я там не нашел.
У меня все работает отлично, за исключением автоматической регистрации.
Мои цели:
- автоматически регистрирует любой производный класс моего базового класса База
- только классы, которые я отмечаю как регистрируемые
- не только прямые подклассы Base
- ex: База → Устройство → Камера → Веб-камера
- это сделало бы использование CRTP, как описано в этом вопросе dificult
- минимальные изменения в классах, которые я хочу зарегистрировать, - фиктивные доказательства
- предпочитает использовать класс регистратора, чем макросы
- как в этот вопрос, но я не уверен, зависит ли это от CRTP
Что у меня:
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;
};
- templated abstract factory, с std::string в качестве ключевого типа
- abstract factory содержит все элементы и методы static
- имя класса восстанавливается автоматически с помощью typeid (при регистрации не требуется текстовое имя)
- путем вызова:
abstract_factory<Base>::register_class<MyDerived>();
То, что я пробовал (или хотел бы, но не знаю, как правильно):
-
registrator<Derived> class
: templateded class, который статически статируется вDerived.cpp
и должен вызыватьabstract_factory::register_class<Derived>()
в нем конструктор- никогда не вызывается или не создается
- Если я создаю экземпляр
Derived
вmain()
, это работает → kinda побеждает цель, но
- объявить простую статическую переменную в каждом
Derived.hpp
и снова установить ее с помощью метода статической регистрации вDerived.cpp
→ , никогда не вызываться. - make
abstract_factory
истинный синглтон вместо того, чтобы все статично?
Может использоваться любой совет, большой или малый, thanx.