中企动力官方网站seo标题生成器
在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;
};