std :: map的静态初始化为unique_ptr

时间:2017-02-01 11:26:35

标签: c++ c++14

我需要一个多态的对象集映射,这需要一个映射到指针以避免slicing。由于我希望将值对象的生命周期与地图对象的生命周期联系起来,我想使用unique_ptr

这引出了以下结构:

#include <memory>
#include <string>
#include <map>
#include <vector>

struct Shape {
    virtual double area() const = 0;
    virtual ~Shape() {};
};
struct Square : public Shape {
    double a;
    Square(double a) { this->a = a; };
    double area() const { return a*a; };
};

typedef std::map<std::string, std::unique_ptr<Shape>> ShapeMap;

// Creating an instance of ShapeMap with a factory is ok:
ShapeMap buildShapeMap() {
    ShapeMap m;
    m.emplace("square1", std::make_unique<Square>(2));
    return m;
}
ShapeMap m1 = buildShapeMap();

但是,我真正想做的是静态构造函数:

/* Fails: std::pair<const _Kty,_Ty>::pair(const std::pair<const _Kty,_Ty> &)': attempting to reference a deleted function
ShapeMap m2{
    { "square1", std::make_unique<Square>(2) }
};
*/

我认为移动语义在某种程度上是不同的 - 但它是我可以解决的问题,还是我应该坚持使用工厂方法?

作为后续问题:我是否应该期待以下类似问题?

struct World {
    std::string name;
    ShapeMap shapes;
    World(std::string const &name, ShapeMap &shapes) : name(name), shapes{ shapes } {
    };
};

World world1{ 
    ShapeMap{
        { "square2", std::make_unique<Square>(3) }
    } 
};

0 个答案:

没有答案