C++模板与泛型编程:构建灵活代码架构
深入讲解 C++ 模板与泛型编程的核心知识。内容包括函数模板与类模板的定义使用、模板参数与特化机制、模板元编程基础及类型萃取方法。同时介绍了 C++ 标准库中常用的模板类与函数,并通过综合案例演示了如何构建一个简单的模板库。文章旨在帮助开发者理解编译期计算原理,掌握通用代码优化技巧,提升代码复用性与扩展性。

深入讲解 C++ 模板与泛型编程的核心知识。内容包括函数模板与类模板的定义使用、模板参数与特化机制、模板元编程基础及类型萃取方法。同时介绍了 C++ 标准库中常用的模板类与函数,并通过综合案例演示了如何构建一个简单的模板库。文章旨在帮助开发者理解编译期计算原理,掌握通用代码优化技巧,提升代码复用性与扩展性。

本章将深入探讨 C++ 模板与泛型编程的核心知识,帮助你构建灵活的代码架构。通过学习,你将能够:
函数模板:是一个通用函数定义,使用类型参数代替具体类型
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 函数模板
template<typename T> T maxValue(const vector<T>& data) {
T maxVal = data[0];
for (const T& value : data) {
if (value > maxVal) {
maxVal = value;
}
}
return maxVal;
}
int main() {
cout << "=== 函数模板示例 ===" << endl;
vector<int> intData = {1, 3, 5, 7, 9};
cout << "整数数组的最大值:" << maxValue(intData) << endl;
vector<double> doubleData = {1.2, 3.4, 5.6, 7.8, 9.0};
cout << "浮点数数组的最大值:" << maxValue(doubleData) << endl;
vector<string> stringData = {"apple", "banana", "cherry", "date"};
cout << "字符串数组的最大值:" << maxValue(stringData) << endl;
return 0;
}
类模板:是一个通用类定义,使用类型参数代替具体类型
#include <iostream>
#include <vector>
using namespace std;
// 类模板
template<typename T> class Stack {
public:
Stack() {}
void push(const T& value) { data.push_back(value); }
T pop() {
if (data.empty()) {
throw runtime_error("Stack is empty");
}
T value = data.back();
data.pop_back();
return value;
}
T top() const {
if (data.empty()) {
throw runtime_error("Stack is empty");
}
return data.back();
}
bool empty() const { return data.empty(); }
size_t size() const { return data.size(); }
private:
vector<T> data;
};
int main() {
cout << "=== 类模板示例 ===" << endl;
Stack<int> intStack;
intStack.push(1);
intStack.push(2);
intStack.push(3);
cout << "整数栈的大小:" << intStack.size() << endl;
cout << "整数栈的顶部元素:" << intStack.top() << endl;
intStack.pop();
cout << "整数栈的顶部元素:" << intStack.top() << endl;
Stack<string> stringStack;
stringStack.push("apple");
stringStack.push("banana");
stringStack.push("cherry");
cout << "字符串栈的大小:" << stringStack.size() << endl;
cout << "字符串栈的顶部元素:" << stringStack.top() << endl;
stringStack.pop();
cout << "字符串栈的顶部元素:" << stringStack.top() << endl;
return 0;
}
模板参数:是模板定义中的类型或值参数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 带有多个类型参数的函数模板
template<typename T, typename U> pair<T, U> makePair(T first, U second) {
return {first, second};
}
int main() {
cout << "=== 模板参数示例 ===" << endl;
auto intDoublePair = makePair(10, 3.14);
cout << "整数 - 浮点数对:" << intDoublePair.first << ", " << intDoublePair.second << endl;
auto stringBoolPair = makePair("hello", true);
cout << "字符串 - 布尔值对:" << stringBoolPair.first << ", " << stringBoolPair.second << endl;
return 0;
}
模板特化:是为特定类型或值参数提供专门的实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 通用函数模板
template<typename T> T maxValue(const vector<T>& data) {
T maxVal = data[0];
for (const T& value : data) {
if (value > maxVal) {
maxVal = value;
}
}
return maxVal;
}
// 模板特化(针对字符串类型)
template<> string maxValue<string>(const vector<string>& data) {
string maxVal = data[0];
for (const string& value : data) {
if (value.length() > maxVal.length()) {
maxVal = value;
}
}
return maxVal;
}
int main() {
cout << "=== 模板特化示例 ===" << endl;
vector<string> stringData = {"apple", "banana", "cherry", "date"};
cout << "字符串数组的最大值:" << maxValue<string>(stringData) << endl;
return 0;
}
模板元编程:是使用模板在编译期进行计算的编程方法
#include <iostream>
using namespace std;
// 递归模板计算阶乘
template<int N> struct Factorial {
static const int value = N * Factorial<N - 1>::value;
};
// 模板特化(终止条件)
template<> struct Factorial<0> {
static const int value = 1;
};
int main() {
cout << "=== 模板元编程示例 ===" << endl;
cout << "5! = " << Factorial<5>::value << endl;
cout << "10! = " << Factorial<10>::value << endl;
return 0;
}
类型萃取:是在编译期获取类型信息的编程方法
#include <iostream>
#include <type_traits>
using namespace std;
// 类型萃取模板
template<typename T> struct TypeTraits {
static const bool is_integral = false;
static const bool is_floating_point = false;
};
// 类型萃取特化(针对整数类型)
template<> struct TypeTraits<int> {
static const bool is_integral = true;
static const bool is_floating_point = false;
};
template<> struct TypeTraits<long> {
static const bool is_integral = true;
static const bool is_floating_point = false;
};
// 类型萃取特化(针对浮点数类型)
template<> struct TypeTraits<float> {
static const bool is_integral = false;
static const bool is_floating_point = true;
};
template<> struct TypeTraits<double> {
static const bool is_integral = false;
static const bool is_floating_point = true;
};
int main() {
cout << "=== 类型萃取示例 ===" << endl;
cout << "int 是整数类型:" << boolalpha << TypeTraits<int>::is_integral << endl;
cout << "long 是整数类型:" << boolalpha << TypeTraits<long>::is_integral << endl;
cout << "float 是浮点数类型:" << boolalpha << TypeTraits<float>::is_floating_point << endl;
cout << "double 是浮点数类型:" << boolalpha << TypeTraits<double>::is_floating_point << endl;
return 0;
}
C++ 标准库中的模板类:如 vector、list、map 等
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <string>
using namespace std;
int main() {
cout << "=== C++ 标准库中的模板类示例 ===" << endl;
// vector
vector<int> vec = {1, 2, 3, 4, 5};
cout << "vector 的大小:" << vec.size() << endl;
vec.push_back(6);
cout << "vector 的大小:" << vec.size() << endl;
// list
list<string> strList = {"apple", "banana", "cherry"};
cout << "list 的大小:" << strList.size() << endl;
strList.push_front("date");
cout << "list 的大小:" << strList.size() << endl;
// map
map<string, int> strMap = {{"apple", 1}, {"banana", 2}, {"cherry", 3}};
cout << "map 的大小:" << strMap.size() << endl;
strMap["date"] = 4;
cout << "map 的大小:" << strMap.size() << endl;
return 0;
}
C++ 标准库中的模板函数:如 std::sort、std::find 等
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main() {
cout << "=== C++ 标准库中的模板函数示例 ===" << endl;
vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};
sort(vec.begin(), vec.end());
cout << "排序后的 vector: ";
for (int num : vec) {
cout << num << " ";
}
cout << endl;
vector<string> strVec = {"apple", "banana", "cherry", "date"};
auto it = find(strVec.begin(), strVec.end(), "cherry");
if (it != strVec.end()) {
cout << "找到元素:" << *it << endl;
}
return 0;
}
TemplateLibraryProject/
├── include/
│ └── TemplateLibrary.h
├── src/
│ ├── TemplateLibrary.cpp
│ └── main.cpp
└── build/
// include/TemplateLibrary.h
#ifndef TEMPLATELIBRARY_H
#define TEMPLATELIBRARY_H
#include <iostream>
#include <vector>
#include <algorithm>
#include <type_traits>
using namespace std;
// 函数模板:计算数组的最大值
template<typename T> T maxValue(const vector<T>& data) {
T maxVal = data[0];
for (const T& value : data) {
if (value > maxVal) {
maxVal = value;
}
}
return maxVal;
}
// 函数模板:计算数组的最小值
template<typename T> T minValue(const vector<T>& data) {
T minVal = data[0];
for (const T& value : data) {
if (value < minVal) {
minVal = value;
}
}
return minVal;
}
// 函数模板:计算数组的平均值
template<typename T>
typename enable_if<is_arithmetic<T>::value, double>::type averageValue(const vector<T>& data) {
T sum = 0;
for (const T& value : data) {
sum += value;
}
return static_cast<double>(sum) / data.size();
}
// 类模板:栈
template<typename T> class Stack {
public:
Stack() {}
void push(const T& value) { data.push_back(value); }
T pop() {
if (data.empty()) {
throw runtime_error("Stack is empty");
}
T value = data.back();
data.pop_back();
return value;
}
T top() const {
if (data.empty()) {
throw runtime_error("Stack is empty");
}
return data.back();
}
bool empty() const { return data.empty(); }
size_t size() const { return data.size(); }
private:
vector<T> data;
};
// 类模板:队列
template<typename T> class Queue {
public:
Queue() {}
void push(const T& value) { data.push_back(value); }
T pop() {
if (data.empty()) {
throw runtime_error("Queue is empty");
}
T value = data.front();
data.erase(data.begin());
return value;
}
T front() const {
if (data.empty()) {
throw runtime_error("Queue is empty");
}
return data.front();
}
bool empty() const { return data.empty(); }
size_t size() const { return data.size(); }
private:
vector<T> data;
};
#endif // TEMPLATELIBRARY_H
// src/TemplateLibrary.cpp
#include "TemplateLibrary.h"
// 模板类的实现通常放在头文件中,这里不需要单独实现
// src/main.cpp
#include <iostream>
#include "TemplateLibrary.h"
using namespace std;
int main() {
cout << "=== 模板库示例 ===" << endl;
// 使用函数模板
vector<int> intData = {1, 3, 5, 7, 9};
cout << "整数数组的最大值:" << maxValue(intData) << endl;
cout << "整数数组的最小值:" << minValue(intData) << endl;
cout << "整数数组的平均值:" << averageValue(intData) << endl;
vector<double> doubleData = {1.2, 3.4, 5.6, 7.8, 9.0};
cout << "浮点数数组的最大值:" << maxValue(doubleData) << endl;
cout << "浮点数数组的最小值:" << minValue(doubleData) << endl;
cout << "浮点数数组的平均值:" << averageValue(doubleData) << endl;
// 使用类模板
Stack<string> stringStack;
stringStack.push("apple");
stringStack.push("banana");
stringStack.push("cherry");
cout << "字符串栈的大小:" << stringStack.size() << endl;
cout << "字符串栈的顶部元素:" << stringStack.top() << endl;
stringStack.pop();
cout << "字符串栈的顶部元素:" << stringStack.top() << endl;
Queue<int> intQueue;
intQueue.push(1);
intQueue.push(2);
intQueue.push(3);
cout << "整数队列的大小:" << intQueue.size() << endl;
cout << "整数队列的头部元素:" << intQueue.front() << endl;
intQueue.pop();
cout << "整数队列的头部元素:" << intQueue.front() << endl;
return 0;
}
# 创建构建目录
mkdir -p build && cd build
# 配置 CMake
cmake ..
# 编译项目
make
# 运行程序
./TemplateLibraryProject
本章介绍了 C++ 模板与泛型编程的核心知识,包括:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online