C++ Any类型实现

来源:互联网 发布:网络爬虫软件下载 编辑:程序博客网 时间:2024/06/05 21:56
C++ Any类型实现

     在java或c#中,Object类型对象可以指向任意类型的变量,因为所有的类默认都从Object类继承。但是在c++中,没有类似Object类这样的类型,而很多时候,为了设计出通用的程序,往往需要类似于Object类型作为参数或者返回值。
    
class any{public: // structors    any()        : content(0)    {    }    template<typename ValueType>    any(const ValueType & value)        : content(new holder<ValueType>(value))    {    }    any(const any & other)        : content(other.content ? other.content->clone() : 0)    {    }    ~any()    {        delete content;    }public: // modifiers    any & swap(any & rhs)    {        std::swap(content, rhs.content);        return *this;    }    template<typename ValueType>    any & operator=(const ValueType & rhs)    {        any(rhs).swap(*this);        return *this;    }    any & operator=(any rhs)    {        rhs.swap(*this);        return *this;    }public: // queries    bool empty() const    {        return !content;    }    const std::type_info & type() const    {        return content ? content->type() : typeid(void);    }public: // types (public so any_cast can be non-friend)    class placeholder    {    public: // structors        virtual ~placeholder()        {        }    public: // queries        virtual const std::type_info & type() const = 0;        virtual placeholder * clone() const = 0;    };    template<typename ValueType>    class holder : public placeholder    {    public: // structors        holder(const ValueType & value)            : held(value)        {        }    public: // queries        virtual const std::type_info & type() const        {            return typeid(ValueType);        }        virtual placeholder * clone() const        {            return new holder(held);        }    public: // representation        ValueType held;    private: // intentionally left unimplemented        holder & operator=(const holder &);    };public: // representation (public so any_cast can be non-friend)    placeholder * content;};template<typename ValueType>  ValueType any_cast(const any& operand)  {      assert(operand.type() == typeid(ValueType));      return static_cast<any::holder<ValueType> *>(operand.content)->held;}

参考链接:http://www.cnblogs.com/feixue/p/boost-any.html