【问题标题】:Copy std::map of std::unique_ptr with polymorphic content复制具有多态内容的 std::unique_ptr 的 std::map
【发布时间】:2018-04-26 08:59:15
【问题描述】:

我有一个带有边缘类的图。我希望边缘是可复制的,但问题是边缘包含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(),它应该返回开始和结束反转的边缘。我目前的问题是我不知道如何复制我的边缘的信息图。

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

【问题讨论】:

  • EdgeInformation 应该有 Clone
  • @DimChtz 我不想反转我的信息图。我只需要它的副本。
  • 你的getInfo 是错误的顺便说一句,类型不匹配。
  • @Jarod42 啊,您对 getInfo 的看法是正确的,谢谢您的提示。克隆方法是个好主意。我会建造那个。非常感谢。

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


【解决方案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;
}

非常感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2018-01-28
    • 2015-03-13
    相关资源
    最近更新 更多