问题与Initialize static std::map with unique_ptr as value类似。 但在我的问题中,映射应该是只读的。 因此,我该如何初始化静态const映射,其中值是std :: unique_ptr:
static const std::map<int, std::unique_ptr<MyClass>>
在这种情况下,静态函数内部的初始化不起作用,
std::map<int, std::unique_ptr<MyClass>> init()
{
std::map<int, std::unique_ptr<MyClass>> mp;
mp[0] = std::make_unique<MyClass>();
mp[1] = std::make_unique<MyClass>();
//...etc
return mp;
}
通过初始化列表进行初始化不起作用
const std::map<int, std::unique_ptr<MyClass>> = {
{ 0, std::make_unique<MyClass>() }
答案 0 :(得分:2)
您不能直接实例化const map
中的initializer list
的{{1}},因为:
从std :: initializer-list构造复制其内容。
,您将无法复制std::unique_ptr
。
因此,您可以“动态”创建地图(在函数内部)并将内容移动到std::unique_ptr
中。
也就是说:
const map
Lambda 可以避免定义静态函数,从而使您的代码更紧凑。
using Map = std::map<int, std::unique_ptr<int>>;
static Map GenMap() {
Map m;
m[0] = std::make_unique<int>(0);
// ...
return m;
}
static const Map globalStaticMap = GenMap();