偷窺Boost Conversion Library(二)

//(接上)<?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::ostreamstd::wostream對象用operator<<()操作

2、 目標類型必須能被輸入流std::istreamstd::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<< arginterpreter>>result就是將arg的值放入到字符串流,把字符串流裏的值放入result

如果操作失敗,就拋出bad_lexical_cast對象。其中bad_lexical_cast對象裏保存了源類型和目標類型的type_info對象的地址,這樣就方便了對錯誤類型的查詢。

 

return 0; //end

參考來源:Boost Conversion Library Documents

發佈了32 篇原創文章 · 獲贊 15 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章