Я пытаюсь перегрузить operator T()
с помощью SFINAE, чтобы вернуть копию, когда T
является фундаментальным типом, и константой ссылки, когда T
является классом.Включить оператор преобразования, используя SFINAE
При использовании double
в моем примере ниже, я не могу получить вторую перегрузку (с std::is_class
), которую необходимо удалить.
То есть ошибка, я получаю:
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
^
Что я делаю неправильно?
#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;
}
Для немного другого примера и дополнительной информации см. Http://stackoverflow.com/questions/18100297/how-can-i-use-stdenable-if-in-a-conversion-operator – Asher
@Asher Использование SFINAE по умолчанию аргумент шаблона работает в вопросе, с которым вы связались, но в вопросе выше, где ОП пытается использовать его для определения двух взаимоисключающих перегрузок, он не будет [как описано здесь] (http://stackoverflow.com/а/29502338/241631). – Praetorian
Возможно, это не позволяет компилятору создавать экземпляры нежелательных операторов преобразования типов? – Museful