模板是C++语言与众不同的特性,也是标准库的基础。
一个模板就是一个编译器用来生成特定类类型或函数的蓝图。
生成特定类或函数的过程称为实例化。
我们只编写一次模板,就可以将其用于多种类型和值,
编译器会为每种类型和值进行模板实例化。
我们既可以定义函数模板,也可以定义类模板。
标准库算法都是函数模板,标准库容器都是类模板。
1. 函数模板
template <typename T>
int compare(cont T &v1, const T &v2)
{
if (v1 < v2)
{
return -1;
}
if (v2 < v1)
{
return 1;
}
return 0;
}
int main()
{
cout << compare(1, 0) << endl;
// int compare(const int &, const int &)
vector<int> vec1{1, 2, 3}, vec2{4, 5, 6};
cout << compare(vec1, vec2) << endl;
// int compare(const vector<int>&, const vector<int>&)
return 0;
}
2. 非类型模板参数
template <unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M])
{
return strcmp(p1, p2);
}
int main()
{
compare("hi", "mom");
// int compare(const char(&p1)[3],const char(&p2)[4])
return 0;
}
3. 类模板
(1)类模板定义
template <typename T>
class Blob
{
public:
typedef T value_type;
typedef typename std::vector<T>::size_type size_type;
Blob();
Blob(std::initializer_list<T> i1);
size_type size() const
{
return data->size();
}
bool empty() const
{
return data->empty();
}
void push_back(const T &t)
{
data->push_back(t);
}
void push_back(T &&t)
{
data->push_back(std::move(t));
}
void pop_back();
T &back();
T &operator[](size_type i);
private:
std::shared_ptr<std::vector<T>> data;
void check(size_type i, const std::string &msg) const;
}
(2)构造函数定义
template <typename T>
Blob<T>::Blob() : data(std::make_shared<std::vector<T>>()) {}
template <typename �T>
BLob<T>::Blob(std::initializer_list<T> i1) : data(std::make_shared<std::vector<T>>(i1)) {}
(3)成员函数定义
template <typename T>
void Blob<T>::check(size_type i, const std::string &msg) const
{
if (i >= data->size())
{
throw std::out_of_range(msg);
}
}
(4)用例
int main()
{
Blob<int> ia;
Blob<int> ia2 = {0, 1, 2, 3, 4};
return 0;
}