オブジェクトを型ID名で作成する便利なオブジェクトファクトリテンプレートがあります。実装はかなり明白です:ObjectFactory
にはstd::string
からオブジェクト作成者関数へのマップが含まれています。次に、作成するすべてのオブジェクトがこのファクトリに登録されます。オブジェクトファクトリにオブジェクト作成者を登録する
は、私はそれを行うには、次のマクロを使用:
#define REGISTER_CLASS(className, interfaceName) \
class className; \
static RegisterClass<className, interfaceName> regInFactory##className; \
class className : public interfaceName
RegisterClass
が使用
class IFoo
{
public:
virtual Do() = 0;
virtual ~IFoo() {}
}
REGISTER_CLASS(Foo, IFoo)
{
virtual Do() { /* do something */ }
}
REGISTER_CLASS(Bar, IFoo)
{
virtual Do() { /* do something else */ }
}
クラスが定義されたと同時に、工場に登録されている
template<class T, class I>
struct RegisterClass
{
RegisterClass()
{
ObjectFactory<I>::GetInstance().Register<T>();
}
};
です。
regInFactory...
静的オブジェクトは.hファイルで定義されているため、すべての翻訳単位に追加されるという問題があります。同じオブジェクト作成者が数回登録され、さらに重要なのは、静的な記憶期間を持つ多くの冗長オブジェクトが存在することです。
クラスやインターフェイスの名前をコピー/ペーストするのではなく、エレガントな登録を行う方法はありますか?冗長な静的オブジェクトを世界中に広げないでください。
VC++固有の拡張機能(C++標準に準拠していないもの)が必要な場合は、これで問題ありません。
素晴らしいアイデア!私はその方法を完全に忘れてしまった。しかし、あなたのバージョンはourRegistererが一度も使用されないので動作しないので、インスタンス化されません。 "AutoRegister(){&ourRegisterer;}"のようなコンストラクタを追加することも、明示的なインスタンス化 "template struct AutoRegister;"を実行することもできます。あなたが気にしているなら、あなたの答えを更新してください:-) –
bocco