我最近遇到了一个有趣的enable_if
用法版本,有条件地启用了一个稍微提高可读性的函数,因为函数的返回类型不是enable_if
的一部分(参见cleaner_usage
):
#include <type_traits>
using maybe_integral = int /* = or float -- then won't compile */;
using return_type = int;
typename std::enable_if<std::is_integral<maybe_integral>::value, return_type>::type
traditional_usage()
{
return 1;
}
template<typename std::enable_if<std::is_integral<maybe_integral>::value, int>::type = 0>
return_type cleaner_usage()
{
return 2;
}
int main()
{
return traditional_usage() + cleaner_usage();
}
对于失败案例,机制是明确的(没有type
成员)。
但在其他情况下它究竟是如何运作的呢?因为将int
typedef
字段替换为具有意外分配的模板类型参数。