C++ template一些体悟(2)

class template的一般化设计之外,特别针对某些参数做特殊设计

#include <iostream>

using namespace std;
//一般设计
template<class I, class O>
class testClass {
public:
    testClass() {
        cout << "I,O" << endl;
    }
};
//以下都是特殊设计
template<class T>
class testClass<T, T> {
public:
    testClass() {
        cout << "T,T" << endl;
    }
};

template<class T>
class testClass<T*, T*> {
public:
    testClass() {
        cout << "T*,T*" << endl;
    }
};

template<class T>
class testClass<const T*, T*> {
public:
    testClass() {
        cout << "const T*,T*" << endl;
    }
};

int main(int argc, char **argv) {
    testClass<int*, int*> obj1;
    return 0;
}

一开始没有找到一般设计和特殊设计有啥关联性,进行一下修改

template<class I>
class testClass {
public:
    testClass() {
        cout << "I,O" << endl;
    }
};

编译报错

error: wrong number of template arguments (2, should be 1)

 这才意识到,是先定义了一般设计,才会有特殊设计,且特殊设计满足一般设计的格式,不过编译器在匹配时,会匹配最类似的。

比如

上述程序的运行结果是

T*,T*

 而非

T,T

 如果注释

//template<class T>
//class testClass<T*, T*> {
//public:
//    testClass() {
//        cout << "T*,T*" << endl;
//    }
//};

运行结果才会是

T,T

 

照此思路设计一个typename T的类试试

#include <iostream>

using namespace std;

//一般设计
template<class I>
class testClass {
public:
    testClass() {
        cout << "I" << endl;
    }
};
//特殊化设计
template<class I>
class testClass<I*> {
public:
    testClass() {
        cout << "I*" << endl;
    }
};

int main(int argc, char **argv) {
    testClass<int*> obj1;
    return 0;
}

 

 果然,和我想得差不多,好多文章就把STL源码分析的这段代码抄一下了事,半点分析没有,我也是自己修修改改试出规律的,没看正规文档的解释。

 

转载于:https://www.cnblogs.com/Jacket-K/p/9263214.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值