我正在尝试使用boost :: enable_if打开/关闭类模板中的某些函数,但总是得到编译错误错误:struct 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添加。
任何人都可以提供帮助??
谢谢!
答案 0 :(得分:2)
SFINAE(用于实现enable_if
的机制)仅适用于函数模板的模板参数的上下文。在您的情况下,T1
是封闭类模板的模板参数,而不是函数模板本身的模板参数。从功能模板的角度来看,它是一种固定类型,并且无法按照它在声明中拼写出来的方式使用它是正常错误,而不是替换失败。
答案 1 :(得分: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> {
//...
};