我有一个带有边类的图。我希望边缘是可复制的,但问题是边缘包含多态内容的 std::unique_ptr
的 std::map
。
我有一个边缘信息的基类。如果边缘需要一些额外的信息,我可以创建该信息类的子类并将其添加到边缘。然后将此信息以信息类型作为键存储在 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;
}
非常感谢。
关于c++ - 复制具有多态内容的 std::unique_ptr 的 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50038890/