繁体   English   中英

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

[英]How to understand the following usage of boost::enable_if and boost::disable_if

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

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

问题1>此处的值是什么意思? 为什么不简单地使用boost::is_arithmetic<T>呢?

boost::is_arithmetic<T>::value

问题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;
}

这是否意味着1>禁用整数类型2>仅接受非整数类型,并且已将嵌入式类型作为type

谢谢

1)value是一个布尔常量,如果T为算术值,则将其定义为true,这在我的boost版本中表示整数或浮点型。

2)如果is_arithmetic :: value为true,则type为T上的typedef,否则未定义。 通常,如果没有定义类型,人们会认为它不会被编译,但是正如boost文档指出的那样:

C ++中模板函数重载的明智操作依赖于SFINAE(替代错误不是错误)原理:如果在函数模板实例化过程中形成了无效的参数或返回类型,则实例化将从设置超载分辨率,而不引起编译错误

当T不是算术运算符时,这是为了删除模板分辨率而删除此特定模板函数的效果。

3)是的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM