使用多态内容复制std :: unique_ptr的std :: map

时间:2018-04-26 08:59:15

标签: c++ copy c++14 unique-ptr

我有一个带边缘类的图表。我希望边可以复制,但问题是边包含std::map std::unique_ptr多态内容。 我有一个基本类的边缘信息。如果一个边需要一些额外的信息,我可以创建这个信息类的子类并将其添加到边缘。然后将此信息存储在地图中,并将信息类型作为密钥。

class Edge {
private:
    std::size_t from;
    std::size_t to;
    std::map<std::type_index, std::unique_ptr<EdgeInformation>> info;
public:
    Edge(std::size_t from, std::size_t to) : from(from), to(to) {
    }

    std::size_t start() const {
        return from;
    }

    std::size_t end() const {
        return to;
    }

    template <typename T, typename... Args>
    void addInfo(Args&&... args) {
        info[typeid(T)] = std::make_unique<T>(std::forward<Args>(args)...);
    }
    template <typename T>
    bool hasInfo() {
        return info.find(typeid(T)) != info.end();
    }
    template <typename T>
    T getInfo() {
        return info[typeid(T)];
    }
    template <typename T>
    void removeInfo() {
        info.erase(std::remove(info.begin(), info.end(), typeid(T)), info.end());
    }

    Edge flipped() const {
        auto flipped_edge = Edge{to, from};
        for(auto &entry : info) {
            // add info to flipped edge here!
        }
        return flipped_edge;
    }
};

在底部,您会看到函数flipped(),它应返回开始和结束反转的边。我目前的问题是我不知道如何复制我边缘的信息图。

My EdgeInformation只是一个没有任何字段或方法的基类。

1 个答案:

答案 0 :(得分:1)

正如@ Jarod42所说的那样,我只需要在我的EdgeInformation类中添加一个克隆方法。所以我的flipped()方法现在可以写成:

.container{
  column-count: 2; 
  width: 50%; 
  border: 1px solid;
}
.entry{
  border: 1px dotted red;
  display: inline-block;
  width: 100%;
 }

非常感谢你。