模板与泛型编程
April 24, 2022About 2 min
模板与泛型编程
定义模板
函数模板
注意:上方 Gist 嵌入依赖 JavaScript,静态站点或网络受限时可能无法显示。若看不到内容,请访问原始 Gist 链接:tewari2312/b76abc15dddf5271772c58ab9dd7e3eb
以下为函数模板的最小示例(备用):
// 函数模板:返回两个值中的较大者 template <typename T> T max_val(T a, T b) { return (a > b) ? a : b; } // 调用示例 int m1 = max_val(3, 7); // T 推导为 int double m2 = max_val(1.5, 2.3); // T 推导为 double
- 在模板定义中,模板参数列表不能为空
template<typename T> - 模板程序应该尽量减少对实参类型的要求,减少特定使用,如调用泛型类中某个函数。
- 函数模板和类模板成员函数的定义通常放在头文件中。
- 保证传递给模板的实参支持模板所要求的操作,以及这些操作在模板中能正确工作,是调用者的责任。
示例代码
类模板
一个类模板的每个实例都形成一个独立的类。类型Blob<string>与任何其他Blob类型都没有关联,也不会对任何其他Blob类型的成员有特殊访问权限
我们既可以在类模板内部,也可以在类模板外部为其定义成员函数,且定义在类模板内的成员函数被隐式声明为内联函数
声明:
ret-type StrBlob::member-name(parm-list)
定义:
template <typename T>
ret-type Blob<T>::member-name(parm-list)
默认情况下,对于一个实例化了的类模板,其成员只有在使用时才被实例化。
C++11中可以直接设置别名
template <typename T>
using BlobT = Blob<T>;
BlobT<std::string> a;
与任何其他static数据成员相同,模板类的每个static数据成员必须有且仅有一个定义。
类似任何其他成员函数,一个static成员函数只有在使用时才会实例化
示例代码