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源码分析的这段代码抄一下了事,半点分析没有,我也是自己修修改改试出规律的,没看正规文档的解释。