模板

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;
}
原文地址:https://www.cnblogs.com/dongzhiquan/p/cpp_template.html