有誰知道如何讓派生類自動實例化一個帶有模板類型的靜態變量(這或者不需要派生類的編寫者,或者強制他調用這個靜態方法以使派生類定義有效)。派生類型的自動靜態調用
這可能是不可能理解的,我會試着更好地定義它。
基本上我有一個全局工廠類與模板函數稱爲registerType。對於從實體派生的每個類,我需要使用派生類型的模板參數調用此函數。目前,我必須在一些初始化函數中手動執行它,這會導致對該函數的大量調用,這種方式違背了模板的原理。
所以我有這樣的:
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";
}
我踐踏,第一條路徑是使'Entity'一個模板類,因此它知道派生類型。有派生類型的問題要麼必須是模板(因此是抽象的),要麼從不用作基類。我也看到了在win32包裝庫中使用的宏。而且,這個問題有點相關 - http://stackoverflow.com/questions/138600/initializing-a-static-stdmapint-int-in-c –
Nm,它似乎被稱爲CRTP,並且答案捕獲了我的越來越:) –