Boost庫基礎-字符串與文本處理(lexical_cast)

字符串

我們這裏注意講解Boost中六個字符串與文本處理領域的組件。

  • lexical_cast和format:用於字符串的表示,類似C標準庫函數功能,可以將數值轉化爲字符串,對輸出做精確的格式化。
  • string_ref:提供一個“只讀視圖”,避免字符串的拷貝代價。
  • string_algo:提供了大量常用的字符串處理函數。
  • tokenizer:這是一個分詞器。
  • xpressive:一個靈活而且功能強大的正則表達式分析器,同時也是一個語法分析器。

lexical_cast

lexical_cast庫進行“字面值”的轉換,類似C中 atoi 函數,可以進行字符串與整數/浮點數之間都字面轉換,包含以下頭文件。

#include <boost/lexical_cast.hpp>
using namespace boost;

lexical_cast使用類似C++標準轉型操作符的形式給出了通用、一致、可理解的語法,以下爲它的聲明:

//標準形式,轉換數字和字符串
template <typename Target,typename Source>
inline Target lexical_cast(const Source &arg);

//轉換C字符串
template <typename Target>
inline Target lexical_cast(const char* chars,std::size_t count);
  • 第一種形式有兩個模板參數,Target需要我們手工指定,是轉換後的目標類型,通常是數字類型或者std::string;而第二個參數Source則不必寫出,因爲它可以由函數參數推導出來。
  • 第二種形式專門處理C字符串,除了const char* 外還支持const unsigned char*、const wchar_t*等其他字符類型,它只接受一個模板參數Target,指明轉換後的目標類型。函數參數chars和count則標記了要轉換的字符串的範圍。

用法:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <string>

using namespace boost;

int main()
{
    //字符串->整數
    int x = lexical_cast<int>("100");

    //字符串->長整數
    long y = lexical_cast<long>("2000");

    //字符串->float
    float pai = lexical_cast<float>("3.14159e5");

    //C字符串->double
    double r = lexical_cast<double>("1.414,x", 5);

    //整數->字符串
    std::string str = lexical_cast<std::string>(456);

    //float->字符串
    std::string str2 = lexical_cast<std::string>(0.618);

    //16進制整數->字符串
    std::string str3 = lexical_cast<std::string>(0x10);

	getchar();
	return 0;
}

錯誤處理:

  • 當lexical_cast無法執行轉換操作時會拋出異常bad_lexical_cast,它是std::bad_cast派生類。爲了使程序更加健壯,我們應該使用try/catch來保護代碼。
  • lexical_cast在名字空間boost::conversion提供try_lexical_convert()函數,可以避免拋出異常,它以bool返回值表示是否轉換成功。

使用注意:

  • 要轉換成數字的字符串中只能有數字和小數點,不能出現字母(表示指數的e/E除外)或其他非數字字符,例如:"123L"、"0x100"
  • 不能把數字轉換成指定格式的字符串
  • 除了轉換數值與字符串,lexical_cast也可以轉換bool類型,但功能有限,不能使用true/false字面值,只能使用1或0
cout<< lexical_cast<bool>("1") <<endl

對轉換對象的要求:

  • 轉換起點對象是可流輸出的,即定義了operator<<
  • 轉換終點對象是可流輸入的,即定義了operator>>
  • 轉換終點對象必須是可缺省構造的可拷貝構造的

C++語言中內建類型(int、double等)和std::string都滿足以上三個條件,對於用戶自定義類型,一般不滿足。

應用於自定義類:

如果想要將lexical_cast應用於自定義類,只需要滿足上面要求即可。準確地說,需要實現流輸出操作符operator<<。

class demo_class
{
    friend std::ostream& operator<<(std::ostream& os,const demo_class& x)
    {
        os<< "demo_class's Name";
        return os;
    }
}

int main()
{
    count << lexical_cast<string>(demo_class()) << endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章