2007年8月9日 星期四

Boost lexical_cast

http://www.boost.org/libs/conversion/lexical_cast.htm

屬於Boost Conversion Library下的一支,很平常的功能,卻有莫大的幫助。

我想很多C++ programmer遇到要把一個字串轉成整數的情況時,還是會不由自主的使用C時代的atoi。但是atoi有一個很嚴重的問題,就是轉換失敗時一律回傳0,這樣就不知道到底真的是0還是轉換失敗了。

C++的IOstream本身就提供了很好用的類別 - stringstream。

stringstream s("12345");
int d;
s >> d;

可以呼叫fail()來測試轉換是否成功,比atoi好了一點,但是卻比較囉唆,為了轉換一個字串還要在stack裡多產生一個stringstream的object,讓人有點擔心效率。於是,Boost lexical_cast就誕生了:

int d = boost::lexical_cast<int>("12345");

很簡潔的寫法,轉換錯誤的話會丟出bad_lexical_cast這個exception。

那整數要轉成string呢?古早時代有人會用itoa這種非標準的函式來做,現在大部分的programmer可能都懂得要用sprintf這個比較general的function來做:

char s[32];
int d = 12345;
sprintf(s, "%d", d);

而lexical_cast的作法還是一樣:

int d = 12345;
string s = boost::lexical_cast<string>(d);


所以,把atoi丟掉吧,C++時代不用再遷就C的老舊函式了。

沒有留言: