如何理解boost :: enable_if和boost :: disable_if的以下用法

时间:2012-01-21 05:29:57

标签: c++ boost

为所有算术类型定义了以下函数:

template <class T>
typename enable_if_c<boost::is_arithmetic<T>::value, T>::type 
foo(T t) { return t; }

问题1&gt;这个价值意味着什么?为什么不简单地使用boost::is_arithmetic<T>

boost::is_arithmetic<T>::value

问题2&gt; typeT吗?

问题3&gt;是boost::is_arithmetic<T>::value仅用于过滤非算术,而且函数实际上只需要T吗?

问题4&gt;如何阅读以下声明?

template <typename T>
void dodah( T i, typename disable_if<is_integral<T> >::type* p=0 )
{
   cout << "I: " << i << endl;
}

是否意味着1&gt;禁用整数类型2&gt;只接受非整数类型,并且嵌入类型为type

谢谢

1 个答案:

答案 0 :(得分:6)

1)value是一个布尔常量,如果T是算术,它将被定义为true,在我的boost版本中,这意味着整数或浮点类型。

2)如果is_arithmetic :: value为true,则type为T上的typedef,否则未定义。通常,如果未定义类型,则会认为这不会编译,但是boost documentation表示:

  

C ++中模板函数重载的合理操作依赖于SFINAE(替换失败不是错误)原则:如果在函数模板实例化期间形成无效参数或返回类型,则实例化为从重载决策集中删除而不是导致编译错误

这是当T不是算术时删除模板分辨率的特定模板函数的效果。

3)是的

4)如果T对于模板分辨率是不可或缺的,则此读取不使用此模板功能。但是,在使用非整数类型调用函数的情况下,您不希望必须传递虚拟的第二个参数,因此是默认值。