为std :: unordered_set创建嵌套类型hash-able

时间:2015-11-19 13:15:50

标签: c++ c++11 boost hash unordered-set

我有一个模板结构。 struct foo具有嵌套类型。

template<typename Data>
struct Bar{
};

template<typename Data>
struct Foo {
typedef typename std::pair<Bar<Data>*,Foo<Data>*> Pointers;
std::unordered_set<Pointers> pointers;
};

我希望make指针适用于std::unordered_set<Pointers>

我在这里读到:
How to specialize std::hash::operator() for user-defined type in unordered containers?
How to properly hash the custom struct?
boost::hash_combine
Templates and nested classes/structures

将所有知识结合到此代码中:

namespace std {

  template <typename Dara> struct hash< typename Foo<Data>::Pointers>
  {

    size_t operator()(const typename Foo<Data>::Pointers & x) const
    {
        std::size_t seed = 0;
        boost::hash_combine(seed, x.first);
        boost::hash_combine(seed, x.second);
        return seed;
    }
  };
}

在最后一段代码中,编译器抛出一个错误:  错误:部分特化中未使用的模板参数:  Data指向此处:typename Data。

我尝试从模板中删除数据并像这样使用它: template <> struct hash< typename Foo::Pointers> 但是编译器告诉我模板的类型错误。

我如何更正我的代码?

此致 塔尔。

2 个答案:

答案 0 :(得分:1)

您无法专注于嵌套类型。编译器无法推断出您想要专门化的内容。您可以直接将std::hash<...>专门用于合适的类型:

namespace std {
    template <typename Data>
    struct hash<std::pair<Bar<Data>*,Foo<Data>*>> {
        ...
    }
}

请注意,指针通常不会成为好键。您可能希望将*x.first*x.secondhash_combine()一起使用。

答案 1 :(得分:0)

我找到了更简单的解决方案: 添加boost :: hash:

让Foo结构像那样:

template<typename Data>
struct Foo {
typedef typename std::pair<Bar<Data>*,Foo<Data>*> Pointers;
std::unordered_set<Pointers,boost::hash<Pointers> pointers;
};

here阅读: