Если кто-то может использовать std::enable_if
, мы можем положиться на SFINAE (ошибка замещения не является ошибкой)
, которая будет работать так:
#include <iostream>
#include <type_traits>
template <class C> class X
{
public:
template <class T, typename std::enable_if< ! std::is_same<double,T>::value>::type * = nullptr > void get_as(){
std::cout << "get as T" << std::endl;
}
template <class T, typename std::enable_if< std::is_same<double,T>::value>::type * = nullptr > void get_as(){
std::cout << "get as double" << std::endl;
}
};
int main()
{
X<int> d;
d.get_as<double>();
return 0;
}
Уродливая вещьчто со всеми этими enable_if должна быть доступна только одна специализация для компилятора, иначе возникнет ошибка устранения неоднозначности.Вот почему поведение по умолчанию «get as T» также требует включения if.