在 C++ 中,模板是一种强大的泛型编程工具,用于编写可以适用于多种数据类型的代码。C++ 提供了以下几种主要的模板类型:
1. 函数模板(Function Templates)
跳转到“1. 函数模板(Function Templates)”函数模板允许编写通用的函数,可以适用于多种数据类型。
示例:
template <typename T>T add(T a, T b) { return a + b;}
int main() { int x = add(1, 2); // 使用 int 类型 double y = add(1.5, 2.5); // 使用 double 类型 return 0;}2. 类模板(Class Templates)
跳转到“2. 类模板(Class Templates)”类模板允许定义通用的类,可以适用于多种数据类型。
示例:
template <typename T>class MyClass {public: MyClass(T value) : data(value) {} T getData() { return data; }
private: T data;};
int main() { MyClass<int> obj1(10); // 使用 int 类型 MyClass<double> obj2(3.14); // 使用 double 类型 return 0;}3. 模板模板参数(Template Template Parameters)
跳转到“3. 模板模板参数(Template Template Parameters)”模板模板参数允许模板类作为另一个模板的参数。
示例:
template <typename T>class Container { T value;};
template <template <typename> class TContainer>class Manager { TContainer<int> container;};
int main() { Manager<Container> manager; // 使用模板模板参数 return 0;}4. 别名模板(Alias Templates)
跳转到“4. 别名模板(Alias Templates)”别名模板是 C++11 引入的,用于为模板定义别名。
示例:
template <typename T>using Vec = std::vector<T>;
int main() { Vec<int> v; // 等价于 std::vector<int> return 0;}5. 变量模板(Variable Templates)
跳转到“5. 变量模板(Variable Templates)”变量模板是 C++14 引入的,用于定义模板变量。
示例:
template <typename T>constexpr T pi = T(3.1415926535897932385);
int main() { double pi_double = pi<double>; // 使用 double 类型 float pi_float = pi<float>; // 使用 float 类型 return 0;}6. 非类型模板参数(Non-Type Template Parameters)
跳转到“6. 非类型模板参数(Non-Type Template Parameters)”模板参数不仅可以是类型,还可以是常量值(如整数、指针等)。
示例:
template <int N>class Array { int data[N];};
int main() { Array<10> arr; // 创建大小为 10 的数组 return 0;}7. 折叠表达式(Fold Expressions,C++17)
跳转到“7. 折叠表达式(Fold Expressions,C++17)”虽然不是模板本身,但与模板变参结合使用时非常强大,用于简化变参模板的操作。
示例:
template <typename... Args>auto sum(Args... args) { return (args + ...); // 使用折叠表达式}
int main() { int result = sum(1, 2, 3, 4); // 结果为 10 return 0;}8. 概念(Concepts,C++20)
跳转到“8. 概念(Concepts,C++20)”概念是 C++20 引入的,用于对模板参数进行约束。
示例:
template <typename T>concept Addable = requires(T a, T b) { a + b; // 要求 T 类型支持加法操作};
template <Addable T>T add(T a, T b) { return a + b;}
int main() { int result = add(1, 2); // 合法 // std::string result2 = add("a", "b"); // 非法,字符串不满足 Addable return 0;}总结
跳转到“总结”C++ 中的模板主要有以下几种类型:
- 函数模板
- 类模板
- 模板模板参数
- 别名模板
- 变量模板
- 非类型模板参数
- 折叠表达式(与变参模板结合)
- 概念(C++20 引入)
在C++中,模板(Template)是一种泛型编程技术,允许编写与类型无关的代码。模板主要分为函数模板和类模板两种。
1. 函数模板
跳转到“1. 函数模板”函数模板用于定义可以接受任意类型参数的函数。例如:
#include <iostream>using namespace std;
// 定义一个函数模板template <typename T>T add(T a, T b) { return a + b;}
int main() { cout << add<int>(3, 5) << endl; // 输出 8 cout << add<double>(2.5, 3.7) << endl; // 输出 6.2 return 0;}关键点:
跳转到“关键点:”template <typename T>:声明一个模板,T是占位符,表示任意类型。- 模板实例化:在调用时可以显式指定类型(如
add<int>),也可以让编译器自动推导类型。
2. 类模板
跳转到“2. 类模板”类模板用于定义可以操作任意类型的类。例如:
#include <iostream>using namespace std;
// 定义一个类模板template <typename T>class Box {private: T value;public: Box(T v) : value(v) {} T getValue() const { return value; }};
int main() { Box<int> intBox(10); // 实例化为 int 类型 Box<string> strBox("Hello"); // 实例化为 string 类型
cout << intBox.getValue() << endl; // 输出 10 cout << strBox.getValue() << endl; // 输出 Hello return 0;}关键点:
跳转到“关键点:”template <typename T>:声明一个类模板,T是占位符。- 类模板实例化:在使用时需要指定具体类型(如
Box<int>)。
3. 模板的特化
跳转到“3. 模板的特化”模板特化允许为特定类型提供特殊实现。例如:
#include <iostream>using namespace std;
// 通用模板template <typename T>class Printer {public: void print(T value) { cout << "Value: " << value << endl; }};
// 特化模板(针对 string 类型)template <>class Printer<string> {public: void print(string value) { cout << "String Value: " << value << endl; }};
int main() { Printer<int> intPrinter; intPrinter.print(42); // 输出 Value: 42
Printer<string> strPrinter; strPrinter.print("Hello"); // 输出 String Value: Hello
return 0;}4. 模板的使用场景
跳转到“4. 模板的使用场景”- 容器类:如
std::vector、std::map等。 - 算法库:如
std::sort、std::find等。 - 通用工具类:如智能指针
std::shared_ptr、std::unique_ptr。
模板是C++中实现代码复用和泛型编程的核心工具,能够显著提高代码的灵活性和可维护性。
来源:CSDN 原文,首次发布于 2025-04-01。