模板特化的多维度挖掘

  假如我有一个需求,就是如果传入的参数是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";
}

  好的,事情到这里结束。  

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...