本文将深入解析如何用C++实现一个精简版Any类,通过抽象基类与模板子类的巧妙结合,实现存储任意类型数据的能力。核心原理是类型擦除技术,让不同类型对象都能通过统一接口操作。

#include // 输入输出 #include // 类型识别:typeid 运算符核心依赖 #include // 标准库 swap 函数 #include // 断言:类型不匹配时报错
实现Any类需要以下基础支持:
typeinfo:为typeid运算符提供支持,确保类型安全;utility:内置std::swap函数,实现高效数据交换;cassert:通过断言机制防止非法操作,增强程序健壮性。class holder
{
public:
virtual ~holder(){} // 虚析构函数
virtual const std::type_info& type() =0; // 纯虚函数:获取类型
virtual holder* clone()=0; // 纯虚函数:克隆对象
};
type()返回存储数据的类型信息;clone()实现深拷贝功能;template
class placeholder:public holder
{
public:
placeholder(const T&val):_val(val){}
virtual const std::type_info& type(){return typeid(T);}
virtual holder* clone(){return new placeholder(_val);}
public:
T _val; // 真实存储数据的变量
};
type()返回模板类型T的信息;clone()创建对象副本实现深拷贝;holder*_content; // 核心指针
// 默认构造:空对象
Any():_content(nullptr){}
// 模板构造函数:接收任意类型数据
template
Any(const T&val):_content(new placeholder(val)){}
// 拷贝构造函数:深拷贝
Any(const Any&other):_content(other._content?other._content->clone():nullptr)
{}
// 析构函数:自动释放内存
~Any(){delete _content;}
_content指针是多态实现的关键,指向具体子类对象;Any&swap(Any&other)
{
std::swap(_content,other._content);
return *this;
}
template
T*get()
{
assert(typeid(T)==_content->type());
return &((placeholder*)_content)->_val;
}
// 赋值1:任意类型直接赋值给 Any
template
Any& operator=(const T&val)
{
Any(val).swap(*this);
return *this;
}
// 赋值2:Any 对象之间赋值
Any& operator=(const Any&other)
{
Any(other).swap(*this);
return *this;
}
class Test
{
public:
Test(){ std::cout<<"构造"<
自定义测试类用于验证:
int main()
{
Any a;
{
Test t;
a=t;
}
a=10;
int *pa=a.get();
std::cout<<*pa<
通过本文的详细解析,我们完整实现了一个精简而强大的Any类,展示了C++多态与模板编程的精妙结合,为处理任意类型数据提供了优雅的解决方案。