Обычно, если для нового типа требуется хэш, std::hash
должен быть специализированным. Я написал тестовую хеширующую библиотеку и хотел бы использовать ее для всех типов, которые уже не были специализированы стандартной библиотекой.Повторное определение std :: hash template struct
Я пробовал следующее с gcc/4.9.3 и clang/3.7.0. К моему удивлению, это работает.
#include <utility>
#include <functional>
#include <iostream>
namespace std {
template<typename T>
class hash
{
public:
size_t operator()(const T & obj)
{
return 99;
}
};
}
int main(void)
{
int i = 10;
std::pair<int, int> pi{22,33};
std::hash<int> hi;
std::hash<std::pair<int, int>> hpi;
std::cout << "Hash of int: " << hi(i) << "\n";
std::cout << "Hash of int pair: " << hpi(pi) << "\n";
return 0;
}
Хэш целого числа является само целое число (которое является стандартной версии библиотеки) и хэш пары 99.
Так два вопроса.
Почему это работает? шаблонная версия
std::hash
уже должна быть объявлена. (Мое единственное предположение, что это находится в более глубоком пространстве имен, которое отправляется)Является ли это стандартным поведением?
Edit: Ответ на вопрос 1 - template<typename T> struct hash
объявлена, но, кажется, не быть определен в любом месте. Вот почему я могу это определить.
Неопределенное поведение, как обычно, включает в себя «появление для работы». –
@ T.C. Следовательно, желая знать, было ли это определено поведение или нет ... –