在 C++ 中,模板是一种强大的泛型编程工具,用于编写可以适用于多种数据类型的代码。C++ 提供了以下几种主要的模板类型:
函数模板允许编写通用的函数,可以适用于多种数据类型。
示例:
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;
}
类模板允许定义通用的类,可以适用于多种数据类型。
示例:
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;
}
模板模板参数允许模板类作为另一个模板的参数。
示例:
template <typename T>
class Container {
T value;
};
template <template <typename> class TContainer>
class Manager {
TContainer<int> container;
};
int main() {
Manager<Container> manager; // 使用模板模板参数
return 0;
}
别名模板是 C++11 引入的,用于为模板定义别名。
示例:
template <typename T>
using Vec = std::vector<T>;
int main() {
Vec<int> v; // 等价于 std::vector
return 0;
}
变量模板是 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;
}
模板参数不仅可以是类型,还可以是常量值(如整数、指针等)。
示例:
template <int N>
class Array {
int data[N];
};
int main() {
Array<10> arr; // 创建大小为 10 的数组
return 0;
}
虽然不是模板本身,但与模板变参结合使用时非常强大,用于简化变参模板的操作。
示例:
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // 使用折叠表达式
}
int main() {
int result = sum(1, 2, 3, 4); // 结果为 10
return 0;
}
概念是 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++中,模板(Template)是一种泛型编程技术,允许编写与类型无关的代码。模板主要分为函数模板和类模板两种。
函数模板用于定义可以接受任意类型参数的函数。例如:
#include
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
:声明一个模板,T
是占位符,表示任意类型。add
),也可以让编译器自动推导类型。类模板用于定义可以操作任意类型的类。例如:
#include
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
:声明一个类模板,T
是占位符。Box
)。模板特化允许为特定类型提供特殊实现。例如:
#include
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;
}
std::vector
、std::map
等。std::sort
、std::find
等。std::shared_ptr
、std::unique_ptr
。模板是C++中实现代码复用和泛型编程的核心工具,能够显著提高代码的灵活性和可维护性。