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

q09*_*987 1 c++ boost

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

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

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

boost::is_arithmetic<T>::value
Run Code Online (Sandbox Code Playgroud)

问题2> type意思是T什么?

问题3>是否真的boost::is_arithmetic<T>::value仅用于过滤非算术,实际上只需要功能T

问题4>如何阅读以下声明?

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

这是否意味着1>禁用整数类型2>只接受非整数类型并且嵌入类型为type

谢谢

Eri*_*tin 6

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

2)如果is_arithmetic :: value为true,则type为T上的typedef,否则未定义.通常,如果没有定义类型,人们会认为这不会编译,但是作为boost文档说明:

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

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

3)是的

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