.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 =
"
<<
x
<<
"
y =
"
<<
y
<<
endl;
return
x
+
y;
}
struct
test
{
int
foo(
int
x,
int
y)
{
cout
<<
"
(test::foo invoking)x =
"
<<
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()));
}