//(接上)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
三、與值和類型相關的類型轉換
1、 lexical_cast
在程序開發中,往往需要將數字型對象的值轉換爲字符文本格式,或反之操作。我們在C/C++標準程序庫中可以找到這樣的函數來進行轉換,例如atoi。但是他們都有個通病,使用複雜,缺少擴展性,更重要的是不夠安全。
使用lexical_cast就可以把這樣的操作簡單化。
try{
int i= 100;
string str= lexical_cast<string>(i);
cout<<"The string is:"<<str<<endl;
str="error";
i=lexical_cast<int>(str);
}
catch(bad_lexical_cast& exobj){
cout<<"No, you can't convert a /"error/" to a int"<<endl;
cout<< exobj.what() << endl;
}
當把"error"轉換爲int時,這個錯誤就會被lexical_cast發現,然後拋處boost::bad_lexical_cast這個異常對象。
對於lexical_cast的使用也是有要求的:
1、 源類型必須能被輸出流std::ostream或std::wostream對象用operator<<()操作
2、 目標類型必須能被輸入流std::istream或std::wostream對象用operator>>()操作
3、 源類型和目標類型必須都是可拷貝構造的
4、 目標類型必須擁有default constructor
2、 窺其內部
template<typename Target, typename Source>
Target lexical_cast(Source arg){
detail::lexical_stream<Target, Source> interpreter;
Target result;
if(!(interpreter << arg && interpreter >> result))
throw_exception(bad_lexical_cast(typeid(Target), typeid(Source)));
return result;
}
其中lexical_stream<>對字符串流做了一系列的包裝,主要提供了operator<<(Source)和operator>>(Target)操作,這兩個操作的返回類型是bool,用於判斷操作是否成功。
Target result;用於返回,這說明了目標類型必須擁有default constructor的原因。
interpreter<< arg和interpreter>>result就是將arg的值放入到字符串流,把字符串流裏的值放入result。
如果操作失敗,就拋出bad_lexical_cast對象。其中bad_lexical_cast對象裏保存了源類型和目標類型的type_info對象的地址,這樣就方便了對錯誤類型的查詢。
return 0; //end
參考來源:Boost Conversion Library Documents