码迷,mamicode.com
首页 > 其他好文 > 详细

boost::any( 能存放任何类型的数据)原理

时间:2015-01-27 18:21:59      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:


=====================
template<class T>
class any
{
public:
    T m_data;
};

void main()
{
    any<int> a;    
}
缺点是 必须知道类型,有时我们并不知道某个对象的类型。
-------------
class any
{
public:
    template<class T>
    any(const T& t)
    {
        m_pData = new T(t);
    }
protected:
    void* m_pData;
};

void main()
{
    any  a(3);    
}
void*是不安全的。
--------------
#include <iostream>

using namespace std ;


class any
{
public:
    template<class T>
    any(const T& t)
    {
        m_pData = new CType<T>(t);
    }
    //析构函数省略

    class CTypeRoot
    {};
    template<class T>
    class CType : public CTypeRoot
    {
    public:
        CType(const T& t):m_value(t)
        {
            
        }
        T m_value;
    };
public:
    CTypeRoot* m_pData;
};

void main()
{
    any  a(3);    

}
可以编译通过了,但无法取值。
===============
#include <iostream>
#include <string>

using namespace std ;


class any
{
public:
    template<class T>
    any(const T& t)
    {
        m_pData = new CType<T>(t);
    }
    //析构函数省略

    class CTypeRoot
    {};
    template<class T>
    class CType : public CTypeRoot
    {
    public:
        CType(const T& t):m_value(t)
        {
            
        }
        T m_value;
    };
public:
    CTypeRoot* m_pData;
};

template<typename ValueType>   
ValueType any_cast(const any& operand,const ValueType tDefault = ValueType() )   
{    
    any::CType<ValueType>* p = static_cast<any::CType<ValueType>* >(operand.m_pData);
    return p->m_value;   
}   


void main()
{
    any  a(3);    
    int y = any_cast<int>(a);
//    string y1 = any_cast<string>(a); //运行出错
}

boost::any( 能存放任何类型的数据)原理

标签:

原文地址:http://blog.csdn.net/he_zhidan/article/details/43197805

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!