2014-01-29 36 views
1

我想使用boost :: enable_if打開/關閉類模板中的某些功能,但始終得到編譯錯誤錯誤:無類型名爲「type」的struct boost :: enable_if如何在類模板中使用boost :: enable_if

我的片段:

#include <iostream> 
#include <tr1/type_traits> 
#include <boost/utility.hpp> 

namespace std { 
    using namespace tr1; 
} 

template <typename T1> 
struct C { 
    template< typename T2 > 
    void test(T2&, typename boost::enable_if< 
    std::is_const<T1>, T1 >::type* = 0) { 

     std::cout << "const" << std::endl; 
    } 

    template< typename T2 > 
    void test(T2&, typename boost::disable_if< 
    std::is_const<T1>, T1 >::type* = 0) { 

     std::cout << "non-const" << std::endl; 
    } 
}; 

int main() { 
    const int ci = 5; 
    int i = 6; 

    C<char> c; 
    c.test(ci); 
    c.test(i); 
    return 0; 
} 

但類似如下的代碼工作的優良:

#include <iostream> 
#include <tr1/type_traits> 
#include <boost/utility.hpp> 

namespace std { 
    using namespace tr1; 
} 

template <typename T1> 
struct C { 
    template< typename T2 > 
    void test(T2&, typename boost::enable_if< 
    std::is_const<T2>, T1 >::type* = 0) { 

     std::cout << "const" << std::endl; 
    } 

    template< typename T2 > 
    void test(T2&, typename boost::disable_if< 
    std::is_const<T2>, T1 >::type* = 0) { 

     std::cout << "non-const" << std::endl; 
    } 
}; 

int main() { 
    const int ci = 5; 
    int i = 6; 

    C<char> c; 
    c.test(ci); 
    c.test(i); 
    return 0; 
} 

我想實現的是禁用/啓用基於類模板聲明的類型的一些成員函數。其實模板成員函數是不需要的。他們只爲SFINAE添加。

任何人都可以幫忙?

謝謝!

回答

2

SFINAE(其中用於實現enable_if的機制)僅在函數模板的模板參數的上下文中起作用。在你的情況下,T1是封閉類模板的模板參數,而不是函數模板本身。從函數模板的角度來看,它是一個固定的類型,不能像聲明中闡述的那樣使用它,這是一個正常的錯誤,而不是替代失敗。

2

一種方法是類本身的一個特例,可能是由於在情況下,基類中你只需要爲一些功能做到這一點:

template <typename T1> 
struct B { 
    template<typename T2> 
    void test(T2&) { 

     std::cout << "non-const" << std::endl; 
    } 
}; 

template <typename T1> 
struct B< const T1 > { 
    template<typename T2> 
    void test(T2&) { 

     std::cout << "const" << std::endl; 
    } 
}; 

template <typename T1> 
struct C : B<T1> { 
    //... 
};