第113讲 boost::format

boost::format


顾名思义,这是一个专门用于格式化操作的,他的功能比boost::lexical_cast要强,不过伦实用性,个人使用boost::lexical_cast的频率要比使用boost::format的频率要得多,因为很多时候其实不只是为了转换而转换,在转换的同时也需要将是否可以转换考虑进去。


那么对于format来说,他有属于他自己的方便性,当我们面对一大堆乱七八糟的东西的时候,我们想要用一个字符串来将这些乱七八糟的东西描述清楚时,format就派上用场了。


format采用oop的编程手法完成了printf完成的工作,但由于他对提供了安全检查,所以从性能上来说要比printf低了不少,但是他们并非是等价的,format不但有参数解析 ,同时也有参数绑定,描述这个现象最简单的方法就是代码:


//==================================


boost::format fmt("

%1% ,%2%, %3%,%3%,%2%,%1%);

fmt.bind_arg(2,20);

fmt%10%30;

std::cout<<
fmt<<std::endl;


//结果:

10,20,30,30,20,10


//===================================

是不是很简单,恩,可能大家看起来还是觉得有些别扭,尤其是第一次接触这么奇怪的书写方式之时,自然一开始我也不能避免,既然都觉得奇怪,那么我们来看看另一种写法是不是稍微脸熟一些呢:


//===================================


std::cout <<boost::format("

%s : %d + %d = %d"

) % "

Sum "

% 1 % 2 % (1 + 2) <<std::endl;


//结果:

Sum : s + 2 = 3;


//===================================


恩,括号里面的东西算是熟悉了,但是括号外的东西还是有些脸生。好吧,关于括号里面的东西这里不做解释了,如果还有人不是太清楚,那么可以回头看看我们的第一二讲关于print函数,那么,我们来说说括号后面的,我们来看一个例子:


//====================================


std::cout<<a<<b<<c<<std::endl;


//别问我a b c是什么鬼


//====================================

恩,这都说到哪里了,是不是跑题了呢?我们不是在说format的吗怎么跑到cout了,好吧,我这里其实想要表达的是操作符的作用,之所以说cout是因为我们每个人都对这个玩意熟悉得不能再熟悉了,所以当我们看到<<的时候就知道是将后面的东西往cout里面扔了,那么现在我们来看看format括号后面的%号是不是一样能够理解了呢,这个%的作用和<<的作用是一样,就是将%号面的内容往format里面扔进去就好,他的原型如同这样:


//==========================================


basic_format&

operator%(…)


format 其实就是basic_format<char>的typedef

wformat 是 basic_format<wchar_t>的typedef


//==========================================


同时format可以很简单的对应printf:


//====================================


std::cout <<boost::format("

%s : %d + %d = %d"

) % "

Sum "

% 1 % 2 % (1 + 2) <<std::endl;


等效于


printf("

%s : %d + %d = %d"

,"

Sum"

, 1, 2, (1 + 2));


//====================================


也许你会觉得使用printf还要来得直观一些,当然我不会反驳你的观点,单从这一点来说确实这样,他不但直观,效率还更好,但是format有printf没有的好处——当我们不是只想将信息打印在控制台,而是想要一个格式化好的字符串的时候的时候使用format要来得快并且安全一些。


//===================================


std::string str = fmt.str();


//==================================


好了,关于和printf类似的一部分算是说了,我也相信你们看明白了,那么现在就剩下哪些看上去脸生的一部分了,比如:


//=================================


boost::format fmt("

(%1% + %1%)*(%2% + %2%) = %3%"

);


//================================


在这句格式化语句中一个段使用了两个%,同时使用了数字来表示段,而这个数字加载两个%之间,这初次看起来有些不好理解,但是细想一下也就明白是怎么回事了。如果format使用了这种格式来格式化,那么两个%号之间的数字就表示你给format提供的第几个参数,也就是在括号面第几个%号后面的那个,好在编程的世界里几句代码胜过千言万语:


//=================================

boost::format fmt("

(%1% + %1%)*(%2% + %2%) = %3%"

);

fmt % 10 % 5;

// 参数1,2

fmt%((10 + 10)*(5 + 5));

//参数3

std::cout<<
fmt<<std::endl;

//结果:

(10+10)*(5+5)=200

//=================================


那么我们再结合一个使用绑定参数的例子:


//===================================


boost::format fmt("

(%1% + %1%)*(%2% + %2%) = %3%"

);

fmt.bind_arg(1, 20);

fmt.bind_arg(3, 100);

fmt%10;

std::cout<<
fmt<<std::endl;


//结果:

(20 + 20)*(10 +10)= 100

//=====================================


走到这里相比大家都清楚format的功能,但是容许我再说一个:当我们还想要继续使用当前的格式重新生成新的东西时,还有一个函数可以帮你,clear,他会清楚当前的缓冲,不过他不会清楚当前所绑定的参数:


//======================================


fmt.clear();

fmt % 30;

std::cout<<
fmt<<std::endl;


//结果:

(20 + 20)*(30 +30)= 100


//======================================


假设,如果我们想要将所预先绑定的参数也清楚那我们就应该使用clear_binds,该函数会将我们预先绑定的所有参数都清楚,当然还有一个clear_bind,只是该函数需要明确的知道你到底是要clear第几个绑定的参数。


第113讲  boost::format

ok,那么这一讲的内容就这么愉快的结束了。


===========================================

回复D或者d查看目录,回复数字查看相应的章节


原文始发于微信公众号(

C/C++的编程教室

):第113讲 boost::format

|

发表评论