使用unique_ptr作为值初始化const静态std :: map

时间:2019-03-29 14:33:19

标签: c++

问题与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>() }

1 个答案:

答案 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();