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