<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在字串處理中少不了格式化字串,C++中傳統的格式化函數是C語言的sprintf,但它一個很大的問題就是不安全。因此,在stl中引入了stringstream來實現安全格式化,但是stringstream卻遠不如sprintf來得直觀。例如,對如如下程式碼:
char text[]="hello"; bool is_all_lower = boost::algorithm::all(text, is_lower()); char output[128]; sprintf(output, "<%s> %s in the lower case", text, (is_all_lower? "is": "is not"));
如果把最後兩句format的函數用stringstream來寫的話,可讀性是遠不如sprintf的。
stringstream output; output << "<" << text << "> " << (is_all_lower)? "is": "is not") << " in the lower case";
boost引入了一個提供類似.net中的string.format的方式提供格式化字串的函數,用它來格式化的話就是如下形式:
boost::format fmt = boost::format("<%s> %s in the lower case") % text % (is_all_lower? "is": "is not"); string output = fmt.str();
前面的例子中演示的是C風格的格式化字串,boost.format也提供了類似.net風格的格式化字串方式:
boost::format fmt = boost::format("<%1%> %2% in the lower case") % text % (is_all_lower? "is": "is not"); cout << fmt << endl;
這種方式更容易看到引數在格式化字串中的位置,推薦這種形式。不過它的起始座標是1而不是0,用慣了.net的string.format的朋友需要注意下。
格式化語法為: [ N$ ] [ flags ] [ width ] [ . precision ] type-char。也提供了C語言和.net兩種風格。
//傳統c語言風格 cout << boost::format("nn%s" "%1t 十進位制 = [%d]n" "%1t 格式化的十進位制 = [%5d]n" "%1t 格式化十進位制,前補'0' = [%05d]n" "%1t 十六進位制 = [%x]n" "%1t 八進位制 = [%o]n" "%1t 浮點 = [%f]n" "%1t 格式化的浮點 = [%3.3f]n" "%1t 科學計數 = [%e]n" ) % "example :n" % 15 % 15 % 15 % 15 % 15 % 15.01 % 15.01 % 15.01 << endl; //.net的風格 cout << boost::format("%1%" "%1t 十進位制 = [%2$d]n" "%1t 格式化的十進位制 = [%2$5d]n" "%1t 格式化十進位制,前補'0' = [%2$05d]n" "%1t 十六進位制 = [%2$x]n" "%1t 八進位制 = [%2$o]n" "%1t 浮點 = [%3$f]n" "%1t 格式化的浮點 = [%3$3.3f]n" "%1t 科學計數 = [%3$e]n" ) % "example :n" % 15 % 15.01 << endl;
既然boost.format函數是用來代替sprintf的,那麼自然就得有例外處理的功能,而不是像sprintf那樣死給你看。boost.format的處理方法是拋異常,它在如下兩種情況家會拋異常:
format字串非法
format繫結非法
如下程式碼演示了這兩種情形:
try { boost::format("<%3"); } catch(std::exception& err) { cout << err.what() << endl; } boost::format fmt = boost::format("<%3%> %2% in the lower case") % text % (is_all_lower? "is": "is not"); try { cout << fmt << endl; } catch(std::exception& err) { cout << err.what() << endl; }
boost.format是以一個物件,而不是函數來實現的,導致其使用和例外處理起來要麻煩不少,不過,利用c++11的可變引數模板的語法還是可以很容易把它封裝成一個可變引數的函數的形式:
string string_fromat(const char* format, …)
需要定義三個過載版本:
template<class TFirst> void string_format(boost::format& fmt, TFirst&& first) { fmt % first; } template<class TFirst, class... TOther> void string_format(boost::format& fmt, TFirst&& first, TOther&&... other) { fmt % first; string_format(fmt, other...); } template<class TFirst, class... TOther> string string_format(const char* format, TFirst&& first, TOther&&... other) { boost::format fmt(format); string_format(fmt, first, other...); return fmt.str(); }
現在就可以這麼用了:
auto output = string_format("<%1%> %2% in the lower case", text, (is_all_lower? "is": "is not"));
所有的異常也都會在該函數中丟擲,雖然效率上相對低點,但用起來要舒服點。
到此這篇關於boost字串處理常式format的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45