簡體   English   中英

使用多態內容復制std :: unique_ptr的std :: map

[英]Copy std::map of std::unique_ptr with polymorphic content

我有一個帶邊緣類的圖表。 我希望邊可以復制,但問題是邊包含多態內容的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只是一個沒有任何字段或方法的基類。

正如@ 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;
}

非常感謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM