Das Beste, was ich mit so weit kam ist die folgende, die zumindest einen typedef
mit einem gemeinsamen Namen in allen Spezialisierung der hash
erfordert:
template <class T> struct hash;
template <> struct hash<int> {
typedef int value_type;
};
template<class T>
constexpr bool is_defined_hash_type(typename hash<T>::value_type) {
return true;
}
template<class T>
constexpr bool is_defined_hash_type(T) {
return false;
}
int main()
{
static_assert ( is_defined_hash_type<int>(0), "hash<int> should be defined");
static_assert (! is_defined_hash_type< double>(0), "hash<Enum> should not be defined");
return 0;
}
Die Syntax ist ziemlich hässlich, aufgrund der zusätzlichen Parameter (wird benötigt, um SFINAE auszulösen). Wenn Sie denken, dass es der richtige Weg ist, werde ich versuchen, es weiter zu säubern.
Haftungsausschluss: Ich bin auf keinen Fall ein C++ 11 Experte, also habe ich vielleicht einige Punkte mit neuen Funktionen verpasst. In diesem Fall Feuer nach Belieben und ich werde versuchen, die Antwort zu korrigieren.
Was ist mit akzeptierter Antwort? – Orient
@Orient Wie Casey in seiner Antwort sagte, ist diese Eigenschaft durch das Design ziemlich gebrochen. Dies ist, was ich in meiner Antwort erklärt habe - Ihr Programm wird illegal sein und selbst wenn es zu funktionieren scheint, kann es seine Bedeutung auf subtile und unvorhersehbare Weise ändern. –
Ich denke, es stellt kein Problem dar, wenn die Instanziierung lokal für eine TU ist und keine externe Verknüpfung (trivial arrangiert) hat. Aber es ist sicherlich etwas zu beachten. Dies könnte auch durch Hinzufügen eines Tag-Typs gemildert werden: 'is_defined_hash_type' –
sehe