测试boost库的any类.装上了,首先就用个any来试试看了.
用any没有用出些感慨,不过顺便用了一下lexical_cast ,感觉那功能不是一般的强大,我喜欢.比itoa好很多了
//////////////////////////////////////////////
/// @defgroup anytest 测试boost any
/// @author abao++
/// @version 1.0
/// @date 2006-9-30 8:42:09
/// @{
//////////////////////////////////////////////
#include <boost/any.hpp>
#include <boost/lexical_cast.hpp>
#include <iostream>
#include<string>
#include<vector>
using namespace std;
using namespace boost;
#define is(a) _v.type()==typeid(a)
//一个变体类
/*!
设计一个class,利用any类使其容纳int,long整数,chat* string字符串,
float double浮点数,并提供输出
*/
class myvar
{
public:
any _v;
myvar(){}
template<typename T> myvar(T v){ _v=v;}
template<typename T> myvar& operator=(T v){ _v=v;return *this;}
friend ostream &operator <<(ostream &o,myvar v);
bool operator!=(myvar& _r){ return _v.content==_r._v.content;}
bool is_char() { return is(char);}
bool is_int() { return is(int);}
bool is_long() { return is(long);}
bool is_double() { return is(double);}
bool is_float() { return is(float);}
bool is_char_ptr()
{
try
{
any_cast<const char *>(_v);
return true;
}
catch(const boost::bad_any_cast &)
{
return false;
}
}
bool is_string()
{
return bool(any_cast<string>(&_v));
}
string tostring()
{
string a;
a=lexical_cast<string>(*this);
return a;
}
};
ostream &operator <<(ostream &o,myvar v)
{
if(v._v.type()==typeid(char))
o<<any_cast<char>(v._v);
else if(v._v.type()==typeid(int))
o<<any_cast<int>(v._v);
else if(v._v.type()==typeid(long))
o<<any_cast<long>(v._v);
else if(v._v.type()==typeid(double))
o<<any_cast<double>(v._v);
else if(v._v.type()==typeid(float))
o<<any_cast<float>(v._v);
else if(v._v.type()==typeid(const char*))
o<<any_cast<const char*>(v._v);
else if(v._v.type()==typeid(string))
o<<any_cast<string>(v._v);
else if(v._v.type()==typeid(myvar))
{
if(v!=any_cast<myvar>(v._v))
o<<any_cast<myvar>(v._v);
else
o<<"(a value reference self)";
}
else
o<<"(undefine type)";
return o;
}
template<typename ValueType>
bool myvar_castout(myvar & v)
{
try
{
cout<<lexical_cast<ValueType>(v)<<"\t";
return true;
}
catch(const boost::bad_lexical_cast &)
{
cout<<"bad"<<"\t";
return false;
}
}
int main(int argc, char* argv[])
{
vector<myvar> t;
t.push_back('0');
t.push_back(1);
t.push_back(2L);
t.push_back(3.0);
t.push_back("4");
t.push_back(string("5"));
t.push_back(myvar("6"));
myvar temp("7");
t.push_back(temp);
for(vector<myvar>::iterator it=t.begin();it<t.end();it++)
{
cout<<*it<<"\t";
myvar_castout<int>(*it);
myvar_castout<char>(*it);
myvar_castout<long>(*it);
myvar_castout<float>(*it);
myvar_castout<double>(*it);
myvar_castout<char*>(*it);
myvar_castout<string>(*it);
cout<<endl;
}
cin.get();
return 0;
}
/// @} 文件注释完毕