boost总结之any

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);
 
原文地址:https://www.cnblogs.com/ourroad/p/3362174.html