模板特化的多维度挖掘
假如我有一个需求,就是如果传入的参数是int类型,我就输出int类型,否则就输出T。很显然,根据模板的基础知识,我们可以这么写
template <class T>
void f(T) {
std::cout << "T\n";
}
template <>
void f(int) {
std::cout << "int\n";
}
除了这样写,还有别的写法吗。我们可以思考一下.................这里我们其实可以用std::enable_if_t来实现,它相当于给std::enable_if的type类型起了一个别名,我们先看怎么写。
template <class T>
std::enable_if_t<std::is_same_v<int, T>> g(T) {
std::cout << "int\n";
}
template <class T>
std::enable_if_t<!std::is_same_v<int, T>> g(T) {
std::cout << "T\n";
}
假设我现在再提一个需求,就是只能实现一个函数,且只能接受int类型的参数,其它类型均不能通过编译。这时候如果你仅仅单纯地void f(int),那么即便你传入double类型进来,它也会发生类型转换并执行这个函数,这并不是我们想要的。因此,我们可以考虑用std::enable_if_t来实现。
template <class T>
std::enable_if_t<std::is_same_v<int, T>> h(T) {
std::cout << "strictly int\n";
}
好的,事情到这里结束。