为所有算术类型定义了以下函数:
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?
谢谢
1)value是一个布尔常量,如果T是算术,它将被定义为true,在我的boost版本中,这意味着整数或浮点类型.
2)如果is_arithmetic :: value为true,则type为T上的typedef,否则未定义.通常,如果没有定义类型,人们会认为这不会编译,但是作为boost文档说明:
C++中模板函数重载的合理操作依赖于SFINAE(替换失败不是错误)原则:如果在函数模板实例化期间形成无效参数或返回类型,则实例化将从重载分辨率设置而不是导致编译错误
这是当T不是算术时去除模板分辨率的特定模板函数的效果.
3)是的
4)如果T是模板分辨率的积分,则不读此模板函数.但是,在使用非整数类型调用函数的情况下,您不希望必须传递虚拟的第二个参数,因此是默认值.