タイプ ID 名でオブジェクトを作成する便利なオブジェクト ファクトリ テンプレートがあります。実装は非常に明白です:オブジェクトクリエーター関数へObjectFactory
のマップが含まれています。std::string
次に、作成されるすべてのオブジェクトがこのファクトリに登録されます。
これを行うには、次のマクロを使用します。
#define REGISTER_CLASS(className, interfaceName) \
class className; \
static RegisterClass<className, interfaceName> regInFactory##className; \
class className : public interfaceName
どこRegisterClass
ですか
template<class T, class I>
struct RegisterClass
{
RegisterClass()
{
ObjectFactory<I>::GetInstance().Register<T>();
}
};
使用法
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 */ }
}
クラスは、ファクトリで同時に定義および登録されます。
問題は、regInFactory...
静的オブジェクトが .h ファイルで定義されているため、すべての翻訳単位に追加されることです。同じオブジェクト作成者が複数回登録され、さらに重要なことに、静的ストレージ期間を持つ冗長なオブジェクトが多数存在します。
このようなエレガントな登録を行う方法はありますか (クラス名とインターフェイス名をコピー/貼り付けするのではなく)、冗長な静的オブジェクトを世界中に広げないでください。
優れたソリューションに VC++ 固有の拡張機能 (C++ 標準に準拠していないもの) が必要な場合は、それで問題ありません。