牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

boost库的常用组件的使用(ZT)

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()));
}
 

posted on 2007-03-20 22:51 杨粼波 阅读(337) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理