2010-11-12 47 views
5

Tại sao mã này (giá trị fnc trong lớp M) không được giải quyết bởi các quy tắc SFINAE? Tôi gặp lỗi:Vấn đề với SFINAE

Error 1 error C2039: 'type' : is not a member of 
            'std::tr1::enable_if<_Test,_Type>' 

Tất nhiên loại không phải là thành viên, không được xác định trong ver chung này của enable_if nhưng không phải là toàn bộ ý tưởng đằng sau việc này để bật ver này nếu bool là đúng và không khởi tạo nó nếu nó sai? Xin vui lòng ai đó giải thích điều đó cho tôi?

#include <iostream> 
#include <type_traits> 

using namespace std; 

template <class Ex> struct Null; 
template <class Ex> struct Throw; 

template <template <class> class Policy> struct IsThrow; 

template <> struct IsThrow<Null> { 
    enum {value = 0}; 
}; 

template <> struct IsThrow<Throw> { 
    enum {value = 1}; 
}; 

template <template <class> class Derived> 
struct PolicyBase { 
    enum {value = IsThrow<Derived>::value}; 
}; 

template<class Ex> 
struct Null : PolicyBase<Null> { }; 

template<class Ex> 
struct Throw : PolicyBase<Throw> { } ; 

template<template< class> class SomePolicy> 
struct M { 

    //template<class T> 
    //struct D : SomePolicy<D<T>> 
    //{ 
    //}; 
    static const int ist = SomePolicy<int>::value; 
    typename std::enable_if<ist, void>::type value() const 
    { 
    cout << "Enabled"; 
    } 

    typename std::enable_if<!ist, void>::type value() const 
    { 
    cout << "Disabled"; 
    } 
}; 

int main() 
{ 
    M<Null> m; 
    m.value(); 
} 

Trả lời

5

SFINAE không làm việc cho các hàm không mẫu. Thay vào đó, bạn có thể, ví dụ: sử dụng chuyên môn hóa (của lớp học) hoặc gửi đi quá tải:

template<template< class> class SomePolicy> 
struct M 
{ 
    static const int ist = SomePolicy<int>::value;   
    void value() const { 
     inner_value(std::integral_constant<bool,!!ist>()); 
    } 
private: 
    void inner_value(std::true_type) const { cout << "Enabled"; } 
    void inner_value(std::false_type) const { cout << "Disabled"; } 
}; 
3

không sfinae đây.

Sau M<Null> được biết là biến số ist cũng được biết. Sau đó, std::enable_if<ist, void> cũng được xác định rõ. Một trong các chức năng của bạn không được xác định rõ.

SFINAE chỉ hoạt động đối với trường hợp chức năng mẫu. Các chức năng mẫu ở đâu?

Thay đổi mã của bạn để

template<int> struct Int2Type {} 

void value_help(Int2Type<true>) const { 
    cout << "Enabled"; 
} 

void value_help(Int2Type<false>) const { 
    cout << "Disabled"; 
} 

void value() const { 
    return value_help(Int2Type<ist>()); 
}