我需要对包含20个字节的四种不同事物的组合进行哈希处理,因此我定义了以下内容:

struct holder
{
  char a;
  uint16_t b;
  uint64_t c;
  char d[9];
} __attribute((__packed__));

然后我可以加载上面的其中之一并将其传递给哈希函数。因此,我希望我的类Foo具有std::tr1::unordered_map<holder, int> map。但是为了声明它在Foo的头文件中,我需要包括holder的定义,在std::tr1中针对我的类型的hash的模板特殊化,并因此需要完整的哈希函数。有没有办法在 header 中没有所有这些代码,但仍然给我的类(class)这个哈希图?

最佳答案

只需在头文件中声明该函数,然后在cpp文件中对其进行定义。

看起来像:

// Header
namespace std { namespace tr1

// Define specialization
template<>
struct hash<holder>: unary_function<holder, size_t> {
    // Declare member
    size_t operator()(holder const&) const;
};

} }

// Source

// Define member
std::size_t std::tr1::hash<holder>::operator()(holder const&) const
{ /* implementation */ }

关于c++ - 如果要对自定义类型使用tr1无序映射,如何避免在 header 中包含哈希函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13094377/

10-12 14:18