在C++中,模板是一种泛型编程的工具,它允许程序员编写与数据类型无关的代码。模板可以用于创建函数模板和类模板。下面是如何在Linux环境下使用C++模板的简要指南。
函数模板允许你定义一个操作,它可以适用于多种数据类型。下面是一个简单的函数模板示例,它定义了一个交换两个变量的函数:
#include <iostream>
// 函数模板定义
template <typename T>
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int i = 10, j = 20;
double d1 = 1.5, d2 = 3.5;
// 使用函数模板
swap(i, j); // 对于int类型
swap(d1, d2); // 对于double类型
std::cout << "i: "<< i << ", j: "<< j << std::endl;
std::cout << "d1: " << d1 << ", d2: " << d2 << std::endl;
return 0;
}
要编译上述代码,你可以使用g++编译器:
g++ -o template_example template_example.cpp
然后运行生成的可执行文件:
./template_example
类模板允许你定义一个类,它的某些部分可以在编译时指定类型。下面是一个简单的类模板示例,它定义了一个栈:
#include <iostream>
#include <vector>
// 类模板定义
template <typename T>
class Stack {
private:
std::vector<T> elems; // 使用vector来存储元素
public:
void push(const T& elem) {
elems.push_back(elem);
}
void pop() {
if (!elems.empty()) {
elems.pop_back();
}
}
T top() const {
return elems.back();
}
bool empty() const {
return elems.empty();
}
};
int main() {
Stack<int> intStack;
intStack.push(1);
intStack.push(2);
intStack.push(3);
while (!intStack.empty()) {
std::cout << intStack.top() << std::endl;
intStack.pop();
}
return 0;
}
同样地,你可以使用g++编译器来编译这个类模板示例:
g++ -o class_template_example class_template_example.cpp
然后运行生成的可执行文件:
./class_template_example
在使用模板时,编译器会为每个使用到的具体类型生成相应的代码。这意味着如果你用不同的类型实例化同一个模板,将会产生不同的函数或类定义。这个过程称为模板实例化。
模板是C++中非常强大的特性,它们广泛应用于标准库中,如STL(Standard Template Library)。熟练使用模板可以提高代码的复用性和灵活性。