在c++中,对于以上任务,容易想到的是一个基类类型指向其所有派生类。因此设计一个Any类,其里面有一个成员基类Base类,其派生类可以是数据date,但是你不知道date到底是什么东西,所以需要使用模版。所以其结构为:
class Any
{
private:
class Base
{
public:
virtual ~Base() = deafult;
}
template<typename T>
class Derive: public Base
{
public:
Derive(T data):m_data(data);
T m_data;
}
private:
std::unique_ptr<Base> m_base;
}
之后将数据赋值给Any类。以下如下:
Any(T data):m_base(std::make_unique<Derive<T>>(data)){}
还需要一个public公有函数将数据类型取出来。
template<typename T>
T cast_()
{
Derive<T>* pd = dynamic_cast<Derive<T>*>(m_base.get());
if(pd == nullptr)
{
throw "数据类型不匹配";
}
return pd->m_data;
}
完整代码:
class Any
{
public:
Any() = default;
~Any() = default;
Any(const Any&) = delete;
Any& operator=(const Any&) = delete;
Any(Any&&) = default;
Any& operator=(Any&&) = default;
//模版构造函数,可以接受任意类型数据,并将其存储在派生类当中
template<typename T>
Any(T data) :m_base(std::make_unique<Derive<T>>(data))
{
}
template<typename T>
T cast_()
{
//通过dynamic_cast将基类指针转化为派生类,进而获取数据
Derive<T>* pd = dynamic_cast<Derive<T>*>(m_base.get());//m_base.get()返回指向base类对象的原始指针
if (pd == nullptr)
{
throw "type is unmatch";
}
return pd->m_data;
}
private:
class Base
{
public:
virtual ~Base() = default;
};
template<typename T>
class Derive : public Base
{
public:
Derive(T data) :m_data(data) {}
T m_data;
};
private:
std::unique_ptr<Base> m_base;
};