自学内容网 自学内容网

c++11实现将任意类型数据与Any类型之间的相互转换

原理

  1. 父类对象可以通过指针指向子类对象
  2. 子类可以拿来封装一个模板类型的数据

因此,可以定义一个Any类,Any类里的数据成员是一个base类型的指针,而在Any类的构造函数里,我们可以将一个任意类型的数据包装成一个继承自base类的类指针,这样就实现了将任意数据转换为Any类型

#ifndef ANY_H
#define ANY_H
#include<memory>
class Any{
public:
/*
    父类指针指向子类对象
    子类封装任意类型的数据
    从而实现将任意类型的数据转换为base指针类型
*/
    template<typename T>
    Any(T data):_base(std::make_unique<Derive<T>>(data)){};
    ~Any()=default;

/*
    std::unique_ptr不能被拷贝,因此该类理论上也不能被拷贝,只可以被移动
*/    
    Any(const Any&)=delete;
    Any(Any&&)=default;
    Any& operator=(const Any&)=delete;
    Any& operator=(Any&&)=default;

/*
    将base类型转换为对应的数据类型
*/
    template<typename T>
    T cast()
    {
        Derive<T>* derivtPtr=dynamic_cast<Derive<T>*>(_base.get());
        if(!derivtPtr)
        {
            throw "data type is unmatch!";
        }

        return derivtPtr->_data;
    }
private:
    class Base
    {
    public:
        Base()=default;
        virtual ~Base()=default;
    };

    template<typename T>
    class Derive:public Base{
    public:
        Derive(T data):_data(data){};
        ~Derive()=default;
        T _data;
    };

    std::unique_ptr<Base> _base;
};
#endif

原文地址:https://blog.csdn.net/qq_58158950/article/details/140594872

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!