Posted on 2011-01-11 14:16
逐漸 閱讀(699)
評論(0) 編輯 收藏 引用
boost any庫可以在如下三方面改善你的程序:(1)任意類型的類型安全存儲以及安全的取回;(2)在標準庫容器中存放不同類型的方法;(3)可以在無須知道類型的情況下傳送類型。
1 boost::any a; //定義any對象
2 a=std::string("boost any"); //any重載了模板賦值函數(shù)
3 a=3.1415;
4 a=15;
5
6 std::string s("any type");
7 boost::any b(s); //any的模板構造函數(shù)
8
從any對象中取出存放數(shù)據(jù)要借助普通模板函數(shù)any_cast,取回數(shù)據(jù)也很簡單.
1 string ss=boost::any_cast<std::string>(b);
如果類型不符any_cast會拋出一個bad_any_cast異常,該異常繼承自std::bad_cast.同時any對象有type()成員函數(shù),可以比較類型后再進行類型轉換.
1
2 if(a.type()==typeid(int))
3 {
4 int i=boost::any_cast<int>(a);
5 //do something
6 }
7 else if(a.type()==typeid(std::string))
8 {
9 std::string s=boost::any_cast<std::string>(a);
10 //do something
11 }
12 else
13 {
14 try
15 {
16 double d=boost::any_cast<double>(a);
17 //do something
18 }
19 catch(std::bad_cast& bc)
20 {
21 std::cout<<"Oops!";
22 //do something
23 }
24 }
25
說明:any類成員函數(shù)empty()用于判斷對象中是否為空,在用any存放指針時要特別注意,any不保證指針非空,即存放空指針時empty()返回還是false.看如下代碼片段便知:
1 int *p=0;
2 a=p;
3 if(!a.empty())
4 {
5 cout<<"a is not empty.\n";
6 }
7 else
8 {
9 cout<<"a is empty.\n";
10 }
11
輸出結果為 a is not empty.所以我們要額外判斷指針是否為空.
1 if(!a.empty())
2 {
3 if(boost::any_cast<int*>(a) != 0)
4 cout<<"a is not empty.\n";
5 else
6 cout<<"null pointer.\n";
7 }
8 else
9 {
10 cout<<"a is empty.\n";
11 }
12
any存放類指針支持多態(tài).