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