Автоматический статический вызов производных типов

Кто-нибудь знает способ заставить производные классы автоматически создавать экземпляр статической переменной с типом шаблона (это либо не должен ничего требовать от автора производного класса, либо заставлять его вызывать этот статический метод, чтобы сделать определение производного класса действительным).

Это, вероятно, невозможно понять, я попытаюсь определить его лучше .

В основном у меня есть глобальный фабричный класс с шаблонной функцией с именем registerType. Для каждого класса, производного от Entity, мне нужно, чтобы эта функция вызывалась с параметром шаблона производного типа. На данный момент мне нужно вручную сделать это в каком-то init функция, которая приводит к большому блоку вызовов этой функции, что в некотором роде противоречит принципу шаблонов для меня.

Итак, у меня есть это:

class Factory
{
  template <typename EntityType>
  registerEntityType();
};

void someInitFunction()
{
   /// All of these are derived from Entity
  gFactory.registerEntityType<EntityType1>();
  gFactory.registerEntityType<EntityType2>();
  gFactory.registerEntityType<EntityType3>();
  /// and so on
}

, тогда как я бы предпочел это:

class Factory
{
  template <typename EntityType>
  registerEntityType();
};

class Entity // Abstract
{
    /// This function should be called automatically with the derived 
    /// type as a parameter
    SomeStaticConstructor<MDerivedType>() 
    {
      gFactory.registerEntityType<MDerivedType>();
    }
};

РЕДАКТИРОВАТЬ: Это это статический повторяющийся код шаблона, который не работает:

Это мой базовый класс и класс для автоматической регистрации материала

template <typename DerivedType>
class Registrar
{
    public:
        Registrar();
        void check();
};
template <typename Product, typename DerivedType>
class AbstractFactory: public AbstractFactoryBase<Product>
{
    public:
        AbstractFactory();
        ~AbstractFactory();
    private:
        static Registrar<DerivedType> registrar;
};

Конструктор регистратора

template <typename DerivedType>
Registrar<DerivedType>::Registrar()
{
    std::cout << DerivedType::name() << " initialisation" << std::endl;
    g_AbstractFactories.registerFactoryType<DerivedType>(DerivedType::name());
}

И производный тип

class CrateFactory : public AbstractFactory<Entity, CrateFactory>
{
    public:
        CrateFactory(FactoryLoader* loader);
        virtual ~CrateFactory();
        Entity* useFactory(FactoryParameters* parameters);
        static std::string name()
        {
            return "CrateFactory";
        }
12
задан deek0146 19 June 2011 в 18:28
поделиться