Est-ce que quelqu'un sait comment créer des classes dérivées instancie automatiquement une variable statique avec un type de modèle (cela ne doit rien exiger de l'auteur de la classe dérivée, ou le forcer à appeler cela statique méthode afin de rendre la définition de classe dérivée valide).Invocation statique automatique de types dérivés
Ceci est probablement impossible à comprendre, je vais essayer de mieux le définir. Fondamentalement, j'ai une classe de fabrique globale avec une fonction de modèle appelée registerType. Pour chaque classe dérivée de l'entité, j'ai besoin que cette fonction soit appelée avec le paramètre template du type dérivé. Pour le moment, je dois le faire manuellement dans une fonction init, ce qui se traduit par un gros bloc d'appels à cette fonction, ce qui va à l'encontre du principe des templates pour moi.
J'ai donc ceci:
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
}
alors que je préférerais avoir ceci:
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: Voici le code du modèle récurrent statique qui ne fonctionne pas:
Cette est ma classe de base, et la classe pour l'enregistrement automatique des choses
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;
};
constructeur
template <typename DerivedType>
Registrar<DerivedType>::Registrar()
{
std::cout << DerivedType::name() << " initialisation" << std::endl;
g_AbstractFactories.registerFactoryType<DerivedType>(DerivedType::name());
}
du bureau d'enregistrement et un type dérivé
class CrateFactory : public AbstractFactory<Entity, CrateFactory>
{
public:
CrateFactory(FactoryLoader* loader);
virtual ~CrateFactory();
Entity* useFactory(FactoryParameters* parameters);
static std::string name()
{
return "CrateFactory";
}
Le premier chemin je foulera fait 'Entity' une classe de modèle, il connaît le type dérivé . Le problème est que les types dérivés doivent eux-mêmes être des modèles (et donc être abstraits), ou ne jamais être utilisés comme classes de base. J'ai également vu des macros utilisées pour cela dans les bibliothèques wrapper win32. Et, cette question est en quelque sorte liée - http://stackoverflow.com/questions/138600/initializing-a-static-stdmapint-int-in-c –
Nm, il semble qu'il s'appelle CRTP, et les réponses capturent ce que j'étais obtenir à :) –