前幾天一個朋友給我看了1段代碼:
any temp; //any is a class
temp = 1;
temp = "a";
temp = x; //x is a abstract class
看到這段代碼著實下了1跳.初期的感覺象void*指針那樣,又象variant變量。但感覺還是比較新穎的,-_-''也許我是菜鳥的原因,在腦袋轉了一下后,我實現了自己的一個類,用來接受任何參數,起初我認為any應該是個typedef,而接收的類型也是前面知道的(-_-''又沒弄清需求就去實現了),所以實現一個接收任何參數的類需要個typelist,和對每種類型的泛化,下面是class的定義:
template<typename _typelist>
class?any
{
public:
?typedef typename Loki::TL::TypeAtNonStrict<_typelist,0>::Result?param1;
?typedef typename Loki::TL::TypeAtNonStrict<_typelist,1>::Result?param2;
?typedef typename Loki::TL::TypeAtNonStrict<_typelist,2>::Result?param3;
?typedef typename Loki::TL::TypeAtNonStrict<_typelist,3>::Result?param4;
?typedef typename Loki::TL::TypeAtNonStrict<_typelist,4>::Result?param5;
?any(param1 param):
??m_param1(param){}
?any(param2 param):
??m_param2(param){}
?any(param3 param):
??m_param3(param){}
?any(param4 param):
??m_param4(param){}
?template<typename _Ty>
?const _Ty&??Get()
?{
???? class?CERROR_ACCESS_DENIED;
???? LOKI_STATIC_CHECK((Loki::TL::IndexOf<_typelist,_Ty>::value != -???? 1),CERROR_ACCESS_DENIED);
???? return?__Access<_Ty>();
?}
private:
?template<typename _Ty>
?_Ty&? __Access();
?template<>
?param1& __Access<param1>() {return m_param1;}
?template<>
?param2& __Access<param2>() {return m_param2;}
?template<>
?param3& __Access<param3>() {return m_param3;}
?template<>
?param4& __Access<param4>() {return m_param4;}
?param1??m_param1;
?param2??m_param2;
?param3??m_param3;
?param4??m_param4;
};
typedef any<Loki::TYPE_LIST_3(int,float,char)>?ANY;
LOKI_STATIC_CHECK((Loki::TL::IndexOf<_typelist,_Ty>::value != -???? 1),CERROR_ACCESS_DENIED);
????: content(0)
{
}
?any(const ValueType & value)
????: content(new holder<ValueType>(value))
{
}
????: content(other.content ? other.content->clone() : 0)
?{
?}
?{
?????delete content;
?}
從構造函數可以看到,any可以接受默認的,任何其他值包括ant本身,在稀構里面可以看到對content的釋放,content在這里是一個基類的指針,是any內部實現的,我們可以看到,在對any構造是有種方法:
(2)content(other.content ? other.content->clone() : 0)
{
?????std::swap(content, rhs.content);
?????return *this;
}
any & operator=(const ValueType & rhs)
{
????any(rhs).swap(*this);
????return *this;
}
{
??????any(rhs).swap(*this);
??????return *this;
}
?{
??????return !content;
?}
?{
??????return content ? content->type() : typeid(void);
?}
{
public: // structors
?????{
?????}
class holder : public placeholder
{
public: // structors
????????????? : held(value)
?????{
?????}
?????{
?????????return typeid(ValueType);
?????}
?????{
??????????return new holder(held);
?????}
(2)content(other.content ? other.content->clone() : 0)
ValueType * any_cast(any * operand)
{
????return operand && operand->type() == typeid(ValueType)
??????????????????? ? &static_cast<any::holder<ValueType> *>? (operand->content)->held
??????????????????? : 0;
}
ValueType any_cast(const any & operand)
{
?????typedef BOOST_DEDUCED_TYPENAME??????? remove_reference<ValueType>::type nonref;
???if(!result)
??????????? boost::throw_exception(bad_any_cast());
????return *result;
}//這里去掉1些原來實現的代碼和注釋
CBase* ptr = &test;
ptr->Set('a');


