0
点赞
收藏
分享

微信扫一扫

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



=====================

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); //运行出错

}

举报

相关推荐

0 条评论