enable_if是模板元编程一个非常有用的利器:
template<bool, typename T = void>
struct enable_if
{
};
template<typename T>
struct enable_if<true, T>
{
typedef T type;
};
可以看到,当enable_if的第一个模板参数为true时,enable_if会有一个类型T的别名type
有的时候对于模板函数,需要根据模板参数类型的不同选择不同的模板函数来执行,此时可以通过enable_if进行模板函数的选择:
#include <iostream>
#include <string>
using namespace std;
template <typename T, typename enable_if<is_integral<T>::value, int>::type = 0>
T f(T x)
{
cout << "param is int" << endl;
return x * x;
}
template <typename T, typename enable_if<!is_integral<T>::value, int>::type = 0>
T f(T x)
{
cout << "param is float" << endl;
return x + x;
}
int main()
{
cout<<f(2)<<endl;
cout<<f(3.14)<<endl;
return 0;
}
//第一个模板函数f,如果T的类型是int,也就is_integral<T>::value的返回值是true时,会导致enable_if的实例化中有一个type的别名。也就是如果T是int,那么会启用该模板函数;否则会禁用该模板函数。
//第二个模板函数的使能是当is_integral<T>::value为false时,也就是T不是int的时候
运行程序输出:
param is int
4
param is float
6.28