boost中any库相对variant简单,any可以不限定类型,variant中对我们事先会定义好我们所需的类型,但是any无此限制,any的类型检测是在run time时.
boost::any t;
t = 4;
std::cout << boost:: any_cast<int >(t) << std::endl ;
t = std ::string( "hello world!");
std::cout << boost:: any_cast<std ::string>( t) << std ::endl;
定义any类型后,既可以赋int类型,也可以赋std::string类型,通过boost的any_cast进行显式转换,这个转换发生在运行期,因此转型可能失败,失败会抛出boost::bad_any_cast异常,如果传入的是any*类型则,可以通过转型后返回指针是否为空判断转型是否成功.
bool is_int (const boost::any & operand)
{
/*利用typeid 进行类型判定 */
return operand .type() == typeid(int );
}
bool is_char_ptr (const boost::any & operand)
{
/*捕获异常判断转型*/
try
{
boost::any_cast <const char *>(operand );
return true ;
}
catch(const boost:: bad_any_cast &)
{
return false ;
}
}
bool is_string (const boost::any & operand)
{
/*判定返回指针是否为空*/
return boost ::any_cast< std::string >(&operand);
}
同样any可以作为容器的元素如下:
std::vector <boost:: any> v ;
v.push_back (4);
v.push_back (std:: string("123456" ));
v.push_back (std:: string("hello world!" ));
std::cout << std:: count_if(v .begin(), v.end (), is_string);