C++模板是泛型编程的一个关键组成部分,允许程序员编写独立于数据类型的代码。下面是一些C++模板的应用举例:
1. 函数模板
函数模板允许我们编写一个函数,它可以接受多种类型的参数。
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int x = 5, y = 10;
double z = 3.5, w = 4.5;
std::cout << "Sum of integers: " << add(x, y) << std::endl;
std::cout << "Sum of doubles: " << add(z, w) << std::endl;
return 0;
}
2. 类模板
类模板允许我们编写一个类,它可以用于多种数据类型。
template <typename T>
class Array {
private:
T* arr;
int size;
public:
Array(T arr[], int s);
void print();
};
template <typename T>
Array<T>::Array(T arr[], int s) {
size = s;
this->arr = new T[s];
for (int i = 0; i < size; i++)
this->arr[i] = arr[i];
}
template <typename T>
void Array<T>::print() {
for (int i = 0; i < size; i++)
std::cout << *(arr + i) << " ";
std::cout << std::endl;
}
int main() {
int intArr[] = {1, 2, 3, 4, 5};
double doubleArr[] = {1.1, 2.2, 3.3, 4.4, 5.5};
Array<int> a(intArr, 5);
Array<double> b(doubleArr, 5);
a.print();
b.print();
return 0;
}
template <typename T>
class Array {
private:
T* arr;
int size;
public:
Array(T arr[], int s);
void print();
};
template <typename T>
Array<T>::Array(T arr[], int s) {
size = s;
this->arr = new T[s];
for (int i = 0; i < size; i++)
this->arr[i] = arr[i];
}
template <typename T>
void Array<T>::print() {
for (int i = 0; i < size; i++)
std::cout << *(arr + i) << " ";
std::cout << std::endl;
}
int main() {
int intArr[] = {1, 2, 3, 4, 5};
double doubleArr[] = {1.1, 2.2, 3.3, 4.4, 5.5};
Array<int> a(intArr, 5);
Array<double> b(doubleArr, 5);
a.print();
b.print();
return 0;
}
3. 模板特化
模板特化允许我们为特定的类型提供模板的特定版本。
template <typename T>
class MyClass {
public:
void print() {
std::cout << "General template." << std::endl;
}
};
template <>
class MyClass<int> {
public:
void print() {
std::cout << "Specialized for int." << std::endl;
}
};
int main() {
MyClass<float> obj1;
MyClass<int> obj2;
obj1.print(); // 输出 "General template."
obj2.print(); // 输出 "Specialized for int."
return 0;
}
4. 模板元编程
模板元编程是C++模板的高级应用,它允许在编译时执行计算和操作类型。例如,可以使用模板递归来计算阶乘:
template <int N>
struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0> {
enum { value = 1 };
};
int main() {
std::cout << "5! = " << Factorial<5>::value << std::endl;
return 0;
}