通常、新しいタイプにハッシュが必要な場合は、std::hash
を特殊化する必要があります。私はテストハッシュライブラリを書いていて、標準ライブラリではまだ特化されていないすべての型に対してそれを使いたいと思っています。std :: hashテンプレート構造体の再定義
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
ように、2つの質問です。
なぜ機能しますか?
std::hash
のテンプレートバージョンは既に宣言されているはずです。 (私の推測では、それはより深い名前空間にあり、転送されます)これは標準的な動作ですか?
編集:質問1 - template<typename T> struct hash
への回答は宣言されていますが、どこにも定義されていないようです。だから私はそれを定義することができます。
未定義の動作には、通常どおり、「動作しています」が含まれます。 –
@ T.C。したがって、これが定義された動作であるかどうかを知りたがっています... –