Próbuję przeciążać operator T()
użyciu SFINAE aby powrócić kopię gdy T
jest podstawowym typem i const odniesienia podczas T
jest klasa.umożliwić operatorowi konwersji przy użyciu SFINAE
Podczas korzystania z double
w moim przykładzie poniżej, nie mogę uzyskać 2. Przeciążenie (z std::is_class
) do usunięcia.
Oznacza to, że błąd dostaję to:
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
^
Co robię źle?
#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;
}
Aby uzyskać nieco inny przykład i dodatkowe szczegóły, zobacz http://stackoverflow.com/questions/18100297/how-can-i-use-stdenable-if-in-a-conversion-operator – Asher
@Asher Używanie SFINAE w ustawieniach domyślnych Argument szablonu działa w pytaniu, z którym łączyłeś się, ale w powyższym pytaniu, gdzie OP próbuje użyć go do zdefiniowania dwóch wzajemnie wykluczających się przeciążeń, nie będzie [jak wyjaśniono tutaj] (http://stackoverflow.com/a/29502338/241631). – Praetorian