想象一下这样的代码:
std::unordered_map<std::string, std::function<Foo *()>> FooFactory;
void registerFoo(std::string name, std::function<Foo *()> factory)
{
FooFactory.emplace(name, factory);
}
如果我现在要在另一个文件中编写这样的代码:
static bool Baz = [](){ registerFoo("baz", []() { return new BazFoo(); })}();
还有一个:
static bool Bar = [](){ registerFoo("bar", []() { return new BarFoo(); })}();
在这种情况下,registerFoo 在程序初始化时被调用,但 FooFactory 随后被清零,因此注册的函数消失了。
有没有办法以一种安全的、独立于编译器的方式(对于 c++14)使它工作?
最佳答案
您可以将工厂本身放在一个函数中:
std::unordered_map<std::string, std::function<Foo *()>>& getFactory() {
static std::unordered_map<std::string, std::function<Foo *()>> FooFactory;
return FooFactory;
}
你的注册函数可以经过哪些:
void registerFoo(std::string name, std::function<Foo *()> factory)
{
getFactory().emplace(name, factory);
}
这应该保证顺序。
关于c++ - 在 C++ 中,我可以使用来自不同文件的值安全地初始化 unordered_map 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45967503/