1

我需要散列四种不同事物的组合,包括 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::tr1hash

4

2 回答 2

4

只需在头文件中声明函数,然后在 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 */ }
于 2012-10-26T21:05:28.047 回答
0

holder 的 hash 特化可以在你的 header 中,但实现不是必须的。为了以一种易于理解的方式执行此操作,它(专业化)可以简单地调用您在 cpp 文件中定义的持有人的沼泽标准函数。

于 2012-10-26T21:16:51.967 回答