我对 std::enable_if 的第二个参数感到困惑。
在使用 int 返回类型时,我们可以使用:
template <class T>
typename std::enable_if<mpi::is_builtin<T>::value, int>::type
foo() { return 1; }
但是如何在参数或模板中使用enable_if?在这种情况下,下面的too函数有什么区别:
template<class T ,
class = typename std::enable_if<std::is_integral<T>::value>::type >
T too(T t) { std::cout << "here" << std::endl; return t; }
int too(int t) { std::cout << "there" << std::endl; return t; }
Thanks.
这意味着如果
template<class T ,
class = typename std::enable_if<std::is_integral<T>::value>::type >
它成为了
template<class T ,
class = void >
如果条件std::is_integral<T>::value
is true
,因此该函数对于该类型是允许的T
因此参与重载决策。
如果不满足条件,则视为非法,typename std::enable_if<...>::type
使该类型的函数无效T
。在您的示例中,第一个方法允许所有整数类型(int
, unsigned
, long
,...)但没有课程等。
第二,int
-only 版本在您的示例中会丢失一些信息,并将值从无符号转换为有符号或缩小某些值,这就是为什么第一个版本在某些情况下非常有用。
注意void
实际上是第二个参数的默认值std::enable_if
,这通常足以启用或禁用模板等,因为您实际上并不需要特定类型。您需要知道/检测的是,它是否有效(void
) 或无效,在这种情况下没有有效的替代::type
part.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)