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 正确指出的那样,您实际上是在初始化时(静态对象初始化时)调用函数,而不是在编译时。AFAIK 如果没有静态对象,您将无法做到这一点。您可以在某些静态对象的构造函数中执行此操作,但这可能会使代码看起来稍微简单一些:

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);
    }
};

FactoryBase(如果您愿意,这可以是一个公共嵌套类。)

翻译单位:

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

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