Мне нужно хэшировать комбинацию из четырех разных вещей, включающую 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
для моего типа, и в результате полная хэш-функция. Есть ли способ не иметь весь этот код в заголовке, но все же дать моему классу этот hashmap?
Просто объявлять функция в заголовочном файле, и определять это в файле 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 */ }
Специализация хеша для владельца может быть в вашем заголовке, но реализация не должна быть. Для простоты понимания этого, он (специализация) может просто вызвать стандартную функцию болота на держателе, которую вы определяете в файле cpp.