Кто-нибудь знает способ заставить производные классы автоматически создавать экземпляр статической переменной с типом шаблона (это либо не должен ничего требовать от автора производного класса, либо заставлять его вызывать этот статический метод, чтобы сделать определение производного класса действительным).
Это, вероятно, невозможно понять, я попытаюсь определить его лучше .
В основном у меня есть глобальный фабричный класс с шаблонной функцией с именем 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";
}