目标是专门化std::hash
来处理名为Node
的子类。
相关课程是:
template<typename T,
typename Hash = std::hash<T>,
typename Pred = std::equal_to <T>,
typename Alloc = std::allocator<T>>
class disjoint_set
{
public:
typedef Hash hasher;
typedef Pred value_equal;
typedef Alloc allocator_type;
protected:
class Node;
unordered_set<Node> table;
// friend class std::hash; // possible solution
class Node
{
public:
T data;
// .......
};
};
我想要一个哈希函数如下:
size_t operator()(const Node& node) const { return hasher(node.data); }
但是,hasher特化必须位于命名空间std
中。我找到的一个解决方案是使专业化成为朋友类,但在这种情况下,我不确定如何访问主类的模板参数?
答案 0 :(得分:1)
您无法专注于类模板的嵌套类 - 您必须编写如下内容:
template <class T>
struct hash<typename Outer<T>::Inner> { ... };
但这是一个非演绎的背景,所以永远不会奏效。
相反,只需将Node
从disjoint_set
中拉出来,然后将其设为独立的类模板即可。此时,专门化std::hash
变得简单明了,在disjoint_set
中使用它也同样容易。