字符串
我們這裏注意講解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;
}