Ich habe eine Hash-Funktion, die jeden Objekttyp und Hash-es kann, verwendet intern std::hash
. Da std::hash
nicht Enum-Typen unterstützen I Überlastungen der Funktion erstellt haben, 1 für Aufzählungen std::underlying_type
und 1 für andere Arten mit:std :: konditional vs std :: enable_if
template <typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr>
static std::size_t Hash(T const & t)
{
return std::hash<typename std::underlying_type<T>::type>()(t);
}
template <typename T, typename std::enable_if<!std::is_enum<T>::value>::type* = nullptr>
static std::size_t Hash(T const & t)
{
return std::hash<T>()(t);
}
Dies funktioniert gut. Ich habe dann versucht es mit std::conditional
alle in eine einzige Funktion zu setzen:
template <typename T>
static std::size_t Hash(T const & t)
{
typedef typename std::conditional<std::is_enum<T>::value, std::hash<typename std::underlying_type<T>::type>, std::hash<T>>::type Hasher;
return Hasher()(t);
}
Main:
enum test
{
TEST = 2
};
int main() {
Hash<test>(TEST);
Hash<int>(5);
std::cin.get();
return 0;
}
Dies ist jedoch mir eine error gab:
/usr/include/c++/5/type_traits:2190:38: error: 'int' is not an enumeration type typedef __underlying_type(_Tp) type;
Ich verstehe die Fehler, aber ich verstehe nicht, warum, ich dachte, std::conditional
würde diese Kompilierungszeit Fehler verhindern, weil <int>
01 verwendetanstelle von std::hash<typename std::underlying_type<T>::type>
zur Kompilierzeit.
Was mache ich hier falsch, gibt es eine Möglichkeit, die 2 Funktionen zusammenzuführen?
Kurz gesagt, "bedingt" erfordert, dass beide Zweige gut gebildet sind. Das Zusammenführen beider Zweige kann mit einer Merkmalsstruktur erfolgen. – Rostislav