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