模板
1.模板函数(模板类的成员函数)只有在被使用的时候才会被实例化。在实例化之前也只会进行有限的错误检查。
这样子有两个好处:
1.换来时间和空间效率,可以省去无用函数编译时间和编译生成代码所占用存储。
2.(模板类的成员函数)可以规避掉某些场景下的编译错误。某模板类在场景1下用到且只用到成员函数f1和f2,场景2下用到且只用到成员函数f2和
f3。而f3在场景1下有可能由于功能局限实例化后语法错误,此时选择性的在场景1下不对f3实例化则可以确保该模板类在两种场景下的通用型。
2.可以将模板参数类型作为当前模板类的基类。
3.模板类不能支持参数数目不同但多个同名(这个原因不明),但是模板函数是可以支持的。
即如下声明是不可以的
template<typename _T> struct Debug { _T _a; Debug(_T a) : _a(a) {} void debug(std::string s) { cout<<_a<<s; } }; template<typename _T, typename _T1> struct Debug { _T _a; _T1 _b; Debug(_T a, _T1 b) : _a(a), _b(b) {} void debug(std::string s) { cout<<_a<<_b<<s; } };
4.模板的特化
模板特化不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。
5.模板类本身可作为模板参数
template<class IT> inline std::string ToString4SeqFlat(const IT & pIt, const IT & pEnd, int iMaxNum = INT_MAX) { std::string tmpString; bool bFirst = true; IT pSeqIt = pIt; for(int i = 0; (pEnd != pSeqIt) && (i < iMaxNum); ++pSeqIt, ++i) { if(bFirst) { bFirst = false; } else { tmpString += ","; } tmpString += ToString(*pSeqIt); } return tmpString; } template<class T, template<typename> class A/*allocator*/, template<typename, class> class SEQ/*container*/> inline std::string ToString4SeqFlat(const SEQ<T, A<T> > & seq, int iMaxNum = INT_MAX) { std::string tmpString; tmpString += "{seq(" + ToString(seq.size()) + "):"; tmpString += ToString4SeqFlat(seq.begin(), seq.end(), iMaxNum); tmpString += "}"; return tmpString; }