8.Template Class

一、类模板简介

类模板提供了定义泛型类的方法,使得类能够处理不同的数据类型。这增强了代码的复用性和灵活性。

1.1 基本定义

类模板使用template关键字定义,后跟模板参数列表。这些参数可以使用typenameclass关键字声明。

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 // REALVECTOR_H

四、示例代码

点击下载示例代码


8.Template Class
https://ci-tz.github.io/2024/02/12/8-Template-Class/
作者
次天钊
发布于
2024年2月12日
许可协议