enable_if在SFINAE的基础上实现了条件判断,可以根据条件是否满足来匹配合适的函数模板。
下面void func(T in)四种模板有不同的条件:
#include <iostream>
#include <string>
//in是否为int型
template<typename T, typename std::enable_if<std::is_same<T,int>::value,bool>::type = true>
void func(T in){
std::cout<<"func int"<<std::endl;
}
//in是否为double型
template<typename T, typename std::enable_if<std::is_same<T,double>::value,bool>::type = true >
void func(T in){
std::cout<<"func double"<<std::endl;
}
//in具有A和B属性
template<typename T, typename std::enable_if<(T::A) && (T::B),bool>::type = true>
void func(T in){
std::cout<<"A && B"<<std::endl;
}
//in具有B和C属性
template<typename T, typename std::enable_if<(T::C) && (T::B),bool>::type = true>
void func(T in){
std::cout<<"C && B"<<std::endl;
}
class Class1{
public:
//Class1具有属性B和C
enum {
A = true,
B = true,
C = false,
};
};
class Class2{
public:
//Class2具有属性B和C
enum {
A = false,
B = true,
C = true,
};
};
int main()
{
int a = 1;
func(std::forward<double>(a));
Class1 b;
func(b);
Class2 c;
func(c);
func(char(10));//报错,找不到匹配模板类型
}
输出结果:
func double
A && B
C && B