2014-01-29 87 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> { 
    //... 
};