专门用于嵌套类C ++的哈希类

时间:2016-06-04 03:02:48

标签: c++ templates hash namespaces specialization

目标是专门化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中。我找到的一个解决方案是使专业化成为朋友类,但在这种情况下,我不确定如何访问主类的模板参数?

1 个答案:

答案 0 :(得分:1)

您无法专注于类模板的嵌套类 - 您必须编写如下内容:

template <class T>
struct hash<typename Outer<T>::Inner> { ... };

但这是一个非演绎的背景,所以永远不会奏效。

相反,只需将Nodedisjoint_set中拉出来,然后将其设为独立的类模板即可。此时,专门化std::hash变得简单明了,在disjoint_set中使用它也同样容易。