学习模板元编程(3)enable_if
目录
行为
实现代码
enable_if_t
注意事项
行为
enbale_if调用方式如下
std::enable_if<布尔型变量,类型>::type
假如第一个输入参数为真,则最终的type与enbale_if<>模板里第二个输入参数的类型相同;否则模板匹配失败。
实现代码
下面是enable_if代码的大致实现:
template<class T>
struct enable_if<bool, T>{}template<class T>
struct enable_if<true, T>
{using type = T;
}
可见,如果enable_if的第一个输入参数为假,则匹配第一个enable_if模板。此时enable_if不含有type,故任何enable_if::type的调用都是无效的,匹配失败;
只有当enable_if的第一个输入参数为真,enable_if才含有type类型,且此时type对应类型T。
enable_if_t
template<bool b, class T>
using enable_if_t = typename enable_if<b, T>::type;
enable_if_t是C++14引入的,其功能是简化enable_if<...>::type
注意事项
理论上,你可以做如下操作:
#include <iostream>template<class T>
typename std::enable_if<std::is_integral<T>::value, T>::type func(T t)
{return t + 10;
}template<class T>
typename std::enable_if<!std::is_integral<T>::value, T>::type func(T t)
{return t;
}int main(void)
{std::cout << func(50) << std::endl;std::cout << func(0.1) << std::endl;std::cin.get();return 0;
}
上述代码确实在编译时实现了类似运行时if-else的功能。但是根据scott meyes的《Effective C++ 11》,避免将enable_if用作函数签名:在返回值或者输入参数里使用enable_if来实现模板匹配是不被提倡的。