模板是 C++ 编程语言的一个特性,它允许函数和类使用泛型类型进行操作。这允许一个函数或类在许多不同的数据类型上工作,而无需为每个类型重写。C++ 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码,C++ 中使用 template 关键字。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
共有三种模板:函数模板、类模板以及自 C++ 14 以来的变量模板:
1.函数模板:
函数模板的行为类似于函数,只是模板可以有许多不同类型的参数。一个函数模板代表一个函数族。使用类型参数声明函数模板的格式是:
template<class identifier> declaration;
template<typename identifier> declaration;
上述两种表达方式完全相同,引入后一种时为了防止混淆。比如 C++ 标准库包含 max(x, y) 返回较大的 x 和的函数模板 y 。该函数模板可以这样定义:
template<typename T> T max(T &a, T &b) { return a > b ? a : b; }
std :: cout << max ( 3 , 7 ) << '\n' ;
std :: cout << max ( 3.0 , 7.0 ) << '\n' ;
这个单一的函数定义适用于许多数据类型。具体来说,它适用于定义了 >(大于运算符)的所有数据类型。除了限制对一个函数描述的更改并使代码更易于阅读之外,函数模板的使用减少了源代码的编写,与为特定程序中使用的所有不同数据类型编写单独的函数相比,模板不会产生更小的目标代码,实际编译器在编译时,会为根据不同的类型编译产生不同的函数。
2.类模板:
类模板提供了基于参数生成类的规范。类模板通常用于实现容器。类模板通过将一组给定的类型作为模板参数传递给它来实例化。C++ 标准库包含许多类模板,特别是改编自标准模板库的容器,例如 vector,list。
C++
template <class T>
class Stack {
private:
vector<T> elements; // 元素
public:
void push(T const&); // 入栈
void pop(); // 出栈
T top() const; // 返回栈顶元素
bool empty() const{ // 如果为空则返回真。
return elements.empty();
}
};
3.变量模板:
在 C++14 以后,变量也可以参数化为特定的类型,这称为变量模板。
C++
template<typename T>
constexpr T pi = T{3.141592653589793238462643383L}; // (Almost) from std::numbers::pi
使用变量模板时,必须显式地指定它的类型:
C++
std::cout << pi<double> << '\n';
std::cout << pi<float> << '\n';
4.函数重载与模板的区别:
函数重载和模板都是面向对象多态特性的例子。当多个函数执行非常相似(不相同)的操作时使用函数重载,当多个函数执行相同操作时使用模板。当模板类或者模板函数中含有静态变量时,则每个模板的实例类型都含有一个静态成员。
C++
template <class T>
class A {
public:
static T val;
};
A<int> a; // 含有静态成员 val;
A<string> b; // 含有静态成员 val;
阅读量:2016
点赞量:0
收藏量:0