在C++中,类型擦除是一种将具体类型的信息擦除以实现泛型编程的技术。它允许我们在不知道或不关心具体类型的情况下操作数据。
一种常见的类型擦除技术是使用模板和虚函数来实现。以下是一个简单的示例:
#include <iostream>
#include <memory>
// 定义一个类型擦除基类
class Any {
public:
virtual ~Any() {}
virtual std::shared_ptr<Any> clone() const = 0;
virtual void print() const = 0;
};
// 具体类型擦除类
template<typename T>
class AnyValue : public Any {
private:
T value;
public:
explicit AnyValue(const T& value) : value(value) {}
// 克隆函数
std::shared_ptr<Any> clone() const override {
return std::make_shared<AnyValue<T>>(value);
}
// 打印函数
void print() const override {
std::cout << value << std::endl;
}
};
int main() {
// 创建两个不同类型的 Any 对象
std::shared_ptr<Any> a1 = std::make_shared<AnyValue<int>>(42);
std::shared_ptr<Any> a2 = std::make_shared<AnyValue<std::string>>("Hello, world!");
// 调用打印函数,无需关心具体类型
a1->print(); // 输出: 42
a2->print(); // 输出: Hello, world!
return 0;
}
在上述示例中,我们定义了一个类型擦除的基类 Any,它包含了两个纯虚函数 clone() 和 print()。然后,我们使用模板类 AnyValue 来实现具体类型的擦除。这个模板类继承自基类 Any,并重写了基类的虚函数。
在 main() 函数中,我们创建了两个不同类型的 Any 对象,并调用它们的 print() 函数,无需关心具体类型。这样我们就可以在运行时处理不同类型的数据,实现了泛型编程的效果。