C++ 泛型和特化
泛型 (Generics)
泛型编程通过模板实现,它允许我们编写可以处理多种数据类型的代码,而不需要为每种类型重写代码
例子
函数模板示例
#include <iostream>
#include <string>
using namespace std;// 泛型函数模板 - 可以比较任何可比较的类型
template <typename T>
T getMax(T a, T b) {return (a > b) ? a : b;
}int main() {// 使用泛型函数比较整数int intMax = getMax(10, 25);cout << "Max integer: " << intMax << endl;// 使用泛型函数比较浮点数double doubleMax = getMax(3.14, 2.71);cout << "Max double: " << doubleMax << endl;// 使用泛型函数比较字符串string strMax = getMax(string("apple"), string("banana"));cout << "Max string: " << strMax << endl;return 0;
}
类模板
#include <iostream>
using namespace std;// 泛型类模板 - 可以存储任何类型的值
template <typename T>
class Container {
private:T value;
public:Container(T val) : value(val) {}T getValue() {return value;}void setValue(T val) {value = val;}void display() {cout << "Value: " << value << endl;}
};int main() {// 使用泛型类存储整数Container<int> intContainer(42);intContainer.display();// 使用泛型类存储字符串Container<string> strContainer("Hello, Templates!");strContainer.display();// 使用泛型类存储浮点数Container<double> doubleContainer(3.14159);doubleContainer.display();return 0;
}
特化(Specialization)
特化允许我们为模板的特定类型提供定制实现,当通用模板不能满足某些类型的特殊需求时非常有用
例子
函数模板
#include <iostream>
#include <cstring>
using namespace std;// 通用模板函数
template <typename T>
void printTypeInfo(T value) {cout << "Generic type: " << value << " (size: " << sizeof(T) << " bytes)" << endl;
}// 特化版本 - 针对const char*类型
template <>
void printTypeInfo<const char*>(const char* value) {cout << "C-string: " << value << " (length: " << strlen(value) << " characters)" << endl;
}// 特化版本 - 针对double类型
template <>
void printTypeInfo<double>(double value) {cout << "Double precision: " << value << " (size: " << sizeof(double) << " bytes)" << endl;
}int main() {int i = 42;double d = 3.14159;const char* str = "Hello, Specialization!";printTypeInfo(i); // 使用通用模板printTypeInfo(d); // 使用double特化printTypeInfo(str); // 使用const char*特化return 0;
}
类模板
#include <iostream>
#include <vector>
using namespace std;// 通用类模板
template <typename T>
class DataProcessor {
public:void process(T data) {cout << "Processing generic data: " << data << endl;}
};// 特化版本 - 针对vector<int>类型
template <>
class DataProcessor<vector<int>> {
public:void process(vector<int> data) {cout << "Processing vector of integers (size: " << data.size() << "):" << endl;for (int val : data) {cout << val << " ";}cout << endl;}
};// 特化版本 - 针对const char*类型
template <>
class DataProcessor<const char*> {
public:void process(const char* data) {cout << "Processing C-string: " << data << endl;cout << "String length: " << strlen(data) << " characters" << endl;}
};int main() {DataProcessor<int> intProcessor;intProcessor.process(42);DataProcessor<const char*> strProcessor;strProcessor.process("Hello, World!");DataProcessor<vector<int>> vecProcessor;vecProcessor.process({1, 2, 3, 4, 5});return 0;
}
总结
泛型: 通过模板实现,允许编写与类型无关的通用代码,提高代码复用性
特化: 为特定类型提供定制实现,处理通用模板无法满足的特殊情况