Ich habe eine Template-Funktion, wo ein Aufzählungstyp in den zugrunde liegenden Typ konvertiert wird, die funktioniert, aber ich schrieb eine Überladung, die eine ganze Zahl nehmen und sich selbst zurückgeben sollte mir ein Fehler, dass Int kein Aufzählungstyp ist. In meiner Vorlage hätte dies herausgefiltert werden sollen. Was ist falsch? Hier"Konvertierung" vom Typ zum gleichen Typ verursacht Fehler
ist der Template-Code:
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<!std::is_enum<TT>::value, TT>::type
{
return t;
}
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<std::is_enum<TT>::value, typename std::underlying_type<TT>::type>::type
{
return (typename std::underlying_type<TT>::type)t;
}
Ich weiß nicht, ob 'underlying_type' ist SFINAE freundlich, aber es gibt eine [Abhilfe] (http://coliru.stacked-crooked.com/a/e7f1dd3b75c8d9c2) für diese –
Was? Ich sehe, dass es funktioniert, aber was passiert hier, dass es funktioniert? Und warum sollte 'based_type' von SFINAE nicht freundlich sein? – Adrian
Die Instanziierung von 'std :: based_type :: type 'ist zurückgestellt, so dass' enable_if' zuerst fehlschlagen kann. Mit * SFINAE-freundlich * Ich meine, dass jeder Ersatz Fehler nur im unmittelbaren Kontext passiert (wenn es innerhalb 'zugrunde liegenden' selbst geschieht es ist nicht SFINAE-freundlich). –