初始化常量静态 std::map unique_ptr作为值



这个问题类似于初始化静态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_ptrconst 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;
}();

最新更新