Я пишу хеш-функтор для использования в 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;
}
};