我正在寫一個用於boost::unordered_map
的散列函數,它將存儲boost::graph
邊描述符。夠簡單。然而,無向和有向圖形邊緣必須以不同方式散列(至少在我的情況下,當圖形無向時,邊緣(u,v)
和(v,u)
是等效的,因此map[(u,v)]
和map[(v,u)]
必須指向相同的值)。我可以使用圖特徵類(boost::graph_traits<Graph>::directed_category
)檢測定向性,但是如何使用模板定義不同的實現?按特性分類的功能
以下是我到目前爲止,但我不希望if
子句。相反,我想要EdgeHash
編譯operator()
的不同版本,具體取決於directed_category
的值。這怎麼能實現?
template <typename Graph>
struct EdgeHash {
typedef typename boost::graph_traits<Graph>::edge_descriptor Edge;
std::size_t operator()(const Edge& e) const {
std::size_t hash = 0;
if(boost::is_same<boost::graph_traits<Graph>::directed_category, boost::directed_tag>::value) {
boost::hash_combine(hash, e.m_source);
boost::hash_combine(hash, e.m_target);
} else {
boost::hash_combine(hash, std::min(e.m_source, e.m_target));
boost::hash_combine(hash, std::max(e.m_source, e.m_target));
}
return hash;
}
};
你的代碼有一些錯誤;在'Hasher'中一個被遺忘的'typename',不會在'operator()'中調用'edge_hash',並且反轉邏輯(這可能是我的錯誤......)。但修復它,它的工作。謝謝! – carlpett
固定。另外,由於Hasher是一種實用類型,您可能想隱藏它,例如通過使它成爲EdgeHash的私有嵌套(成員)類。 – AndrzejJ
太棒了!我已經把它放在一個匿名的命名空間中,所以這不是問題:) – carlpett