人生最可悲的事情,莫过于胸怀大志,却又虚度光阴。 ​​​​

《C++ Primer》读书笔记 第16章 模版与泛型编程

2017.09.03

16.1 定义模版

16.1.1 函数模版

模版定义以关键字template开始,后跟一个模版参数列表(template parameter list),这是一个逗号分隔的一个或多个模版参数(template parameter)的列表。

template <typename T>
int compare(const T &v1,const T &v2)
{
    if(v1 < v2) return -1;
    if(v2 < v1) return 1;
    return 0;
}

实例化函数模版

cout << compare(1,2) << endl; //-1
vector<int> vec1{1,2,3},vec2{4,5,6};
cout << compare(vec1,vec2) << endl; //-1

模版类型参数

我们的compare函数有一个模版类型参数(type parameter)。一般来说,我们可以将类型参数看做类型说明符,就像内置类型或类类型说明符一样使用。特别是,类型参数可以用来指定返回类型或函数的参数类型,以及在函数体内用于变量声明或类型转换。

template <typename T> T foo(T* p)
{
    T tmp = *p;
    //...
    return tmp;
}

类型参数前必须使用关键字classtypename

//错误:U之前必须加上class或typename
template <typename T,U> T calc(const T&,const U&);

非类型模版参数

除了定义类型参数,还可以在模版中定义非类型参数(nontype parameter)

template <unsigned N,unsigned M>
int compare(const char (&p1)[N],const char (&p2)[M])
{
    return strcmp(p1,p2);
}
cout << compare("hi","mom") << endl; //-5

inline和constexpr的函数模版

编写类型无关的代码

模版编译

大多数编译错误在实例化期间报告