zoukankan      html  css  js  c++  java
  • boost库的使用介绍

    1.boost::any

    boost::any是一种通用的数据类型,可以将各种类型包装后统一放入容器内
    最重要的它是类型安全的。有点象COM里面的variant.

    使用方法:
    any::type() 返回包装的类型
    any_cast可用于any到其他类型的转化

     

    #include  < boost / any.hpp >
    void  test_any()
    {
     typedef std::vector
    < boost::any >  many;
     many a;
     a.push_back(
    2 );
     a.push_back(
    string ( " test " ));

     
    for (unsigned  int  i = 0 ;i < a.size(); ++ i)
     
    {
      cout
    << a[i].type().name() << endl;
      
    try
      
    {
       
    int  result  =  any_cast < int > (a[i]);
       cout
    << result << endl;
      }

      
    catch (boost::bad_any_cast  &  ex)
      
    {
       cout
    << " cast error: " << ex.what() << endl;
      }

     }

    }


    2.boost::array

    boost::array仅仅是对数组一层薄薄的封装,提供跟各种算法配合的iterator,使用方法很简单
    注意:可以使用{}来初始化array,因为array所有的成员变量都是public的

     

    #include  < boost / array.hpp >
    void  test_array()
    {
     array
    < int , 10 >  ai  =   { 1 , 2 , 3 } ;

     
    for (size_t i = 0 ;i < ai.size(); ++ i)
     
    {
      cout
    << ai[i] << endl;
     }

    }


    3.boost::lexical_cast
    lexical_cast用于将字符串转换成各种数字类型(int,float,short etc.)

     

    #include  < boost / lexical_cast.hpp >
    void  test_lexical_cast()
    {
     
    int  i  =  boost::lexical_cast < int > ( " 123 " );
     cout 
    <<  i  <<  endl;
    }


    4.boost::format
    boost::format是用于替代c里面的sprintf,优点是类型安全,不会因为类型和参数不匹配而导致程序崩溃了
    而且还可以重复使用参数

     

    #include  < boost / format.hpp >
    void  test_format()
    {
     cout 
    <<  boost::format( " writing %1%,  x=%2% : %3%-th try " %   " toto "   %   40.23   %   50   << endl; 

     format f(
    " a=%1%,b=%2%,c=%3%,a=%1% " );
     f 
    %   " string "   %   2   %   10.0 ;

     cout 
    <<  f.str()  <<  endl;
    }


    5.boost::tokenizer
    boost::tokenizer是用于切割字符串的,类似于Java里面的StringTokenizer。

    #include  < boost / tokenizer.hpp >
    void  test_tokenizer()
    {
     
    string  s( " This is  , a ,test! " );
     boost::tokenizer
    <>  tok(s);
     
    for (tokenizer <> ::iterator beg = tok.begin(); beg != tok.end(); ++ beg) {
           cout 
    <<   * beg  <<   " \n " ;
     }

    }



    6.boost::thread
    boost::thread是为了提供跨平台的thread机制。利用boost::function来完成委托。

     

    #include  < boost / thread.hpp >
    void  mythread()
    {
     cout
    << " hello,thread! " << endl;
    }


    void  test_thread()
    {
     boost::function
    <   void  ()  >  f(mythread);
     boost::thread t(f);
     t.join();
     cout
    << " thread is over! " << endl;
    }


    7.boost::serialization
    boost::serialization提供object的序列化功能。而且提供好几种序列化的格式,比如text,binary,xml

    #include  < boost / archive / text_oarchive.hpp >
    #include 
    < boost / archive / text_iarchive.hpp >
    #include 
    < boost / archive / xml_oarchive.hpp >
    void  test_serialization()
    {
     boost::archive::text_oarchive to(cout , boost::archive::no_header);
     
    int  i  =   10 ;
     
    string  s  =   " This is a test\n " ;
     to 
    &  i;
     to 
    &  s;

     ofstream f(
    " test.xml " );
     boost::archive::xml_oarchive xo(f);
     xo 
    &  BOOST_SERIALIZATION_NVP(i)  &  BOOST_SERIALIZATION_NVP(s);

     boost::archive::text_iarchive ti(cin , boost::archive::no_header);
     ti 
    &  i  &  s;
     cout 
    << " i= " <<  i  <<  endl;
     cout 
    << " s= " <<  s  <<  endl;
    }

    8.boost::function
    boost::function就是所谓的泛函数,能够对普通函数指针,成员函数指针,functor进行委托,达到迟调用的效果

     

    #include  < boost / function.hpp >
    int  foo( int  x, int  y)
    {
     cout
    <<   " (foo invoking)x =  " << <<   "  y =  " <<  y  << endl;
     
    return  x + y;
    }


    struct  test
    {
     
    int  foo( int  x, int  y)
     
    {
      cout
    <<   " (test::foo invoking)x =  " << <<   "  y =  " <<  y  << endl;
      
    return  x + y;
     }

    }
    ;

    void  test_function()
    {
     boost::function
    < int  ( int , int ) >  f;
     f 
    =  foo;
     cout 
    <<   " f(2,3)= " << f( 2 , 3 ) << endl;

     test x;
     
    /* f = std::bind1st(
          std::mem_fun(&test::foo), &x);
    */

     boost::function
    < int  (test * , int , int ) >  f2;
     f2 
    =   & test::foo;
      
     cout 
    <<   " f2(5,3)= " << f2( & x, 5 , 3 ) << endl;
    }


    9.boost::shared_ptr
    boost::shared_ptr就是智能指针的实现,不象std::auto_ptr,它是可以stl的容器一起使用的,非常的方便

    #include  < boost / shared_ptr.hpp >
    class  Shared
    {
    public :
     Shared()
     
    {
      cout 
    <<   " ctor() called " << endl;
     }

     Shared(
    const  Shared  &  other)
     
    {
      cout 
    <<   " copy ctor() called " << endl;
     }

     
    ~ Shared()
     
    {
      cout 
    <<   " dtor() called " << endl;
     }

     Shared 
    &   operator   =  ( const  Shared  &  other)
     
    {
      cout 
    <<   " operator =  called " << endl;
     }

    }
    ;

    void  test_shared_ptr()
    {
     typedef boost::shared_ptr
    < Shared >  SharedSP;
     typedef vector
    < SharedSP >  VShared;
     VShared v;
     v.push_back(SharedSP(
    new  Shared()));
     v.push_back(SharedSP(
    new  Shared()));
    }

  • 相关阅读:
    MVP社区巡讲照片集
    周末之个人杂想(十六)
    SQL Server 2014 BI新特性(二)结合Data Explorer和GeoFlow进行数据分析
    SQL Server 2014 BI新特性(一)五个关键点带你了解Excel下的Data Explorer
    Tabular Model下的ADOMD.NET
    玩玩Excel下的Power View
    LeakCanary,30分钟从入门到精通
    Android热修复技术总结
    阿里最新热修复Sophix与QQ超级补丁和Tinker的实现与总结
    热修复——深入浅出原理与实现
  • 原文地址:https://www.cnblogs.com/lzjsky/p/1990019.html
Copyright © 2011-2022 走看看