struct substitute_failure{};
template<typename T>
struct substitute_success:true_type{};
template<>
struct substitute_success<substitute_failure>:false_type{};
template<typename T>
class get_result;
template<typename T>
struct has_f:substitute_success<typename get_result<T>::type>{};
template<typename T>
class get_result{
template<typename X>
static auto check(X const& x)->decltype(f(x));
static substitute_failure check(...);
public:
using type = decltype(check(declval<T>()));
};
template<typename T>
constexpr bool Has_f(){
return has_f<T>::value;
}
template<bool B,typename T=void>
struct enable_if1{
typedef T type;
};
template<typename T>
struct enable_if1<false,T>{};
template<bool B,typename T=void>
using Enable_if = typename enable_if1<B,T>::type; //Error: no type named 'type' in 'struct enable_if1<false, void>'
class myFun{
public:
void f(){cout << "have fun!\n";}
};
int main(){
myFun mf{};
Enable_if<Has_f<myFun>()> mf.f(); //Error: expected initializer before '.' token
return 0;
}
я получил ошибки (также рассматривается в коде как аннотация):Как написать шаблонный код для выбора функций
Ошибки: нет типа с именем «типом» в «структуру enable_if1»
Ошибки : ожидаемый инициализатор до '.' токен
Согласно SFINAE, компилятор должен просто пренебрегать «неудачным случаем», верно? Я также пробовал std::enable_if
и получил те же ошибки.