Ich versuche, operator T()
mit SFINAE überladen, um eine Kopie zurückzugeben, wenn T
ein grundlegender Typ ist, und eine const-Referenz, wenn T
eine Klasse ist.Aktivieren Sie Konvertierungsoperator mit SFINAE
Bei der Verwendung eines double
in meinem Beispiel unten, kann ich nicht die 2. Überlast (mit std::is_class
) entfernt werden.
Das heißt, der Fehler Ich erhalte ist:
error: no type named ‘type’ in ‘struct std::enable_if<false, const double&>’
operator typename std::enable_if< std::is_class<T>::value, const T&>::type() const
^
Was mache ich falsch?
#include <iostream>
#include <type_traits>
template<typename T>
struct Foo
{
operator typename std::enable_if<!std::is_class<T>::value, T >::type() const
{
return _val;
}
operator typename std::enable_if< std::is_class<T>::value, const T&>::type() const
{
return _val;
}
T _val;
};
int main()
{
Foo<double> f1;
f1._val = 0.3;
double d = f1;
std::cout << d << std::endl;
return 0;
}
Für ein etwas anderes Beispiel und weitere Details, siehe http://StackOverflow.com/Questions/18100297/How-Cani-I-use-Stdenable-Fi-in-Aconversion-Operator – Asher
@Assher Verwendung von SFINAE im Standard Das Template-Argument funktioniert in der Frage, mit der Sie verlinkt sind, aber in der obigen Frage, wo das OP versucht, es zu verwenden, um zwei sich gegenseitig ausschließende Überladungen zu definieren, wird es nicht [wie hier erklärt] (http://stackoverflow.com)/a/29502338/241631). – Praetorian