这个问题类似于初始化静态std::map,unique_ptr作为值。但是在我的问题中,地图应该是只读的。那么,我如何启动静态常量映射,其中值为 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>() }
您不能直接实例化具有initializer list
std::unique_ptr
的const map
,因为:
从 std::初始值设定项列表构造会复制其内容。
而且您无法复制std::unique_ptr
.
因此,您可以"动态"创建地图(在函数内(并将内容移动到const map
中。
那是:
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();
Lambda 可以避免定义静态函数,从而使您的代码更加紧凑。
static const Map globalStaticMap = []() {
Map m;
m[0] = std::make_unique<int>(0);
// ...
return m;
}();