Как можно избежать использования хеш-функции impl в моем заголовке, если я хочу использовать неупорядоченную карту tr1 для пользовательского типа?

Мне нужно хэшировать комбинацию из четырех разных вещей, включающую 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?

0

Решение

Просто объявлять функция в заголовочном файле, и определять это в файле 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 */ }
4

Другие решения

Специализация хеша для владельца может быть в вашем заголовке, но реализация не должна быть. Для простоты понимания этого, он (специализация) может просто вызвать стандартную функцию болота на держателе, которую вы определяете в файле cpp.

0

По вопросам рекламы [email protected]