0

そのため、初期化時に関数を呼び出せるようにしたいと考えています。これはvoid関数ですが、呼び出されるまでに副作用(この場合はファクトリ関数テーブルの更新)が整っていることを望みますmain()。今私がやっていることは、int を返し、それで静的変数を初期化することです:

//Factory inherits from FactoryBase
class FactoryBase
{
    ...
private:
    static std::unordered_map<std::string, FactoryBase*> factoryTable;
public:
    template<class C>
    static int addClass(const std::string& name)
    {
        factoryTable[name] = new Factory<C>;
        return 0;
    }
};
...
int Foo::uselessStaticInt = FactoryBase::addClass<Foo>("foo");
//class Foo is now associated with the string "foo"

静的 int を必要とせずに静的関数を呼び出す方法はありますか?

Factory クラスの完全なソースを投稿できますが、もっと興味があるのは、コンパイル時または初期化時の関数呼び出しです。

4

2 に答える 2

1

@interjay によって正しく指摘されたように、実際には、コンパイル時ではなく、初期化時 (静的オブジェクトが初期化される時) に関数を呼び出しています。私の知る限り、静的オブジェクトがないとこれを行うことはできません。コードが少し単純に見えるかもしれませんが、いくつかの静的オブジェクトのコンストラクターでこれを行うことができます:

ClassRegister<Foo> fooRegister("foo"); // Call FactoryBase::addClass<Foo>("foo")
                                       // in the constructor of ClassRegister<Foo>
于 2012-06-17T19:38:02.753 に答える
0

私はよく、単一のグローバル インスタンスとともに、補助レジストレータ クラスを使用します。

ヘッダファイルFactoryBase.hpp:

template <typename T> struct Registrator
{
    explicit Registrator(char const * s)
    {
        FactoryBase<T>::addClass(s);
    }
};

(必要に応じて、ネストされた public クラスにFactoryBaseすることもできます。)

翻訳単位:

#include <FactoryBase.hpp>
#include <Foo.hpp>

namespace
{
    Registrator<Foo> fooRegistrator("foo");
}
于 2012-06-17T19:43:51.053 に答える