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

3

我有一个带边类的图。我希望边是可复制的,但问题在于边包含一个多态内容的std::unique_ptrstd::map。 我有一个用于边信息的基类。如果一条边需要额外信息,我可以创建一个这个信息类的子类并将其添加到边上。然后,将此信息存储在以信息类型为键的映射中。

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(),它应该返回起点和终点相反的边缘。我目前的问题是我不知道如何复制我的边缘的信息映射。
我的EdgeInformation只是一个没有任何字段或方法的基类。

2
EdgeInformation 应该有 Clone 方法。 - Jarod42
@DimChtz 我不想反转我的信息映射。我只需要它的一个副本。 - Schorsch
1
你的 getInfo 函数有问题,顺便说一下,类型不匹配。 - Jarod42
@Jarod42 哦,你说的getInfo是对的,谢谢你的提示。克隆方法是个好主意,我会去实现的。非常感谢。 - Schorsch
1个回答

1
正如@Jarod42所说,我只需要在我的EdgeInformation类中添加一个克隆方法。因此,现在可以将我的flipped()方法编写为:
Edge flipped() const {
    auto flipped_edge = Edge{to, from};
    for(auto &entry : info) {
        flipped_edge.info[entry.first] = entry.second->clone();
    }
    return flipped_edge;
}

谢谢你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接