2016-02-11 4 views
0
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 и получил те же ошибки.

ответ

1

Вы, кажется, не понимаете, как работает SFINAE. Это не волшебная палочка, чтобы игнорировать искаженный код. SFINAE работает только для функций или деклараций классов, и только в том смысле, что определение функции отказа или объявление класса не рассматриваются. В вашем конкретном случае вы безоговорочно определяете enable_if как псевдоним шаблона до enable_if1::type, поэтому, если вы создаете переменную этого типа (как вы, кажется, пытаетесь сделать), вы должны определить этот тип.

Однако, трудно сказать, что именно вы пытаетесь сделать, поскольку ваш код не является синтаксически правильным в любом случае.

Смежные вопросы