一、类模板简介
类模板提供了定义泛型类的方法,使得类能够处理不同的数据类型。这增强了代码的复用性和灵活性。
1.1 基本定义
类模板使用template
关键字定义,后跟模板参数列表。这些参数可以使用typename
或class
关键字声明。
1 2 3 4 5 6 7 8 9
| template <typename T1, typename T2> class MyPair { public: T1 getFirst(); T2 getSecond(); private: T1 first; T2 second; };
|
1.2 成员函数实现
类外成员函数实现需要前置模板参数声明:
1 2 3 4 5 6 7 8 9
| template<typename T1, typename T2> T1 MyPair<T1, T2>::getFirst() { return first; }
template<typename T1, typename T2> T2 MyPair<T1, T2>::getSecond() { return second; }
|
注意:
- 成员函数定义前需要重申模板参数。
- 使用
MyPair<T1, T2>
来指定函数所属的类模板。
二、Member Types
模板类型中的成员类型(例如迭代器)提供了访问依赖类型的标准方法。
2.1 语法
1 2 3 4 5 6 7 8 9 10 11 12 13
| template<typename ValueType> class RealVector { public: using iterator = ValueType*; using const_iterator = const ValueType*; iterator begin(); const_iterator cbegin() const; iterator end(); const_iterator cend() const; private: ValueType* elems; size_t size; };
|
2.2 接口实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| template<typename ValueType> typename RealVector<ValueType>::iterator RealVector<ValueType>::begin() { return elems; }
template<typename ValueType> typename RealVector<ValueType>::const_iterator RealVector<ValueType>::cbegin() const { return elems; }
template<typename ValueType> typename RealVector<ValueType>::iterator RealVector<ValueType>::end() { return elems + size; }
template<typename ValueType> typename RealVector<ValueType>::const_iterator RealVector<ValueType>::cend() const { return elems + size; }
|
注意:
- 成员类型定义在类命名空间内。
- 使用
typename
明确模板参数类型中的嵌套类型。
三、模板类头文件与源文件编写
为确保模板类正常编译,源文件内容应包含在头文件内。
原因:模板在实例化前不生成代码,因此需要将实现(.cpp)包含在头文件(.h)中。
例如:
realvector.h
1 2 3 4 5 6 7 8
| #ifndef REALVECTOR_H #define REALVECTOR_H template<typename ValueType> class RealVector { }; #include "realvector.cpp" #endif
|
四、示例代码
点击下载示例代码