VS2013enable_if源码分析
//xtr1common⽂件
// TEMPLATE CLASS enable_if
template<bool _Test, class _Ty = void>//第⼀个模板参数类型bool,这是⼀种技术
struct enable_if
{ // type is undefined for assumed !_Test
};
template<class _Ty>
struct enable_if<true, _Ty>//这⾥⽤到了偏特化,模板实例化时只有第⼀个模板那参数是true的才会使⽤此偏特化版本,此时才有typedef _Ty type学上网
{ // type is _Ty for _Test
typedef _Ty type;破伤风治疗方法
社会功能};
利⽤模板偏特化技术,第⼀个模板参数为true的时候,会⽤第⼆个类,否则⽤第⼀个类。
typename std::enable_if<true, int>::type t; //正确
混血豺王读后感typename std::enable_if<true>::type; //可以通过编译,没有实际⽤处,推导的模板是偏特化版本,第⼀模板参数是true,第⼆模板参数是通常版本中定义的默认类型即typename std::enable_if<fal>::type; //⽆法通过编译,type类型没有定义
typename std::enable_if<fal, int>::type t2; //同上
template <typename T>//std::is_trivial<T>::value为true会使⽤这个函数腌咸菜的做法大全
typename std::enable_if<std::is_trivial<T>::value>::type SFINAE_test(T value)
{
std::cout<<"T is trival"<<std::endl;
}
template <typename T>//std::is_trivial<T>::value为fal会使⽤这个函数
生日红包祝福语
typename std::enable_if<!std::is_trivial<T>::value>::type SFINAE_test(T value)
{
std::cout<<"T is none trival"<<std::endl;
}
恨的近义词SFINAE_test(std::string("123"));//对应第⼀个函数
SFINAE_test(123);//对应第⼆个函数
下⾯这个例⼦,只有T为int才会编译正确,否则std::is_integral<T>::value, bool>为fal,enable_if 就不会有typedef type,就会编译错
误
template <typename T>
typename std::enable_if<std::is_integral<T>::value, bool>::type
is_odd(T t) {
return bool(t%2);
}
template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
bool is_even(T t) {
return !is_odd(t);
希腊景点}