boost 的 format 库

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

#include <iostream>

#include <iomanip>

#include <cassert>

#include "boost/format.hpp"

// 2 custom namespaces, to bring in a few useful names :

namespace MyNS_ForOutput {

using std::cout; using std::cerr;

using std::string;

using std::endl; using std::flush;

using boost::format;

using boost::io::group;

}

namespace MyNS_Manips {

using std::setfill;

using std::setw;

using std::hex ;

using std::dec ;

// gcc-2.95 doesnt define the next ones

// using std::showbase ;

// using std::left ;

// using std::right ;

// using std::internal ;

}

int main(){

using namespace MyNS_ForOutput;

using namespace MyNS_Manips;

std::cout << format("%|1$1| %|2$3|") % "Hello" % 3 << std::endl;

// Reordering :

cout << format("%1% %2% %3% %2% %1% \n") % "o" % "oo" % "O"; // 'simple' style.

// prints "o oo O oo o \n"

cout << format("(x,y) = (%1$+5d,%2$+5d) \n") % -23 % 35; // Posix-Printf style

// No reordering :

cout << format("writing %s, x=%s : %d-th step \n") % "toto" % 40.23 % 50;

// prints "writing toto, x=40.23 : 50-th step \n"

cout << format("(x,y) = (%+5d,%+5d) \n") % -23 % 35;

cout << format("(x,y) = (%|+5|,%|+5|) \n") % -23 % 35;

cout << format("(x,y) = (%|1$+5|,%|2$+5|) \n") % -23 % 35;

// all those are the same, it prints "(x,y) = ( -23, +35) \n"

// Using manipulators, via 'group' :

cout << format("%2% %1% %2%\n") % 1 % group(setfill('X'), hex, setw(4), 16+3) ;

// prints "XX13 1 XX13\n"

// printf directives's type-flag can be used to pass formatting options :

cout << format("_%1$4d_ is : _%1$#4x_, _%1$#4o_, and _%1$s_ by default\n") % 18;

// prints "_ 18_ is : _0x12_, _ 022_, and _18_ by default\n"

// Taking the string value :

std::string s;

s= str( format(" %d %d ") % 11 % 22 );

assert( s == " 11 22 ");

// -----------------------------------------------

// %% prints '%'

cout << format("%%##%#x ") % 20 << endl;

// prints "%##0x14 "

// -----------------------------------------------

// Enforcing the right number of arguments

// Too much arguments will throw an exception when feeding the unwanted argument :

try {

format(" %1% %1% ") % 101 % 102;

// the format-string refers to ONE argument, twice. not 2 arguments.

// thus giving 2 arguments is an error

}

catch (boost::io::too_many_args& exc) {

cerr << exc.what() << "\n\t\t***Dont worry, that was planned\n";

}

// Too few arguments when requesting the result will also throw an exception :

try {

cerr << format(" %|3$| ") % 101;

// even if %1$ and %2$ are not used, you should have given 3 arguments

}

catch (boost::io::too_few_args& exc) {

cerr << exc.what() << "\n\t\t***Dont worry, that was planned\n";

}

cerr << "\n\nEverything went OK, exiting. \n";

return 0;

}

输出:

Hello 3

o oo O oo o

(x,y) = ( -23, +35)

writing toto, x=40.23 : 50-th step

(x,y) = ( -23, +35)

(x,y) = ( -23, +35)

(x,y) = ( -23, +35)

XX13 1 XX13

_ 18_ is : _0x12_, _ 022_, and _18_ by default

%##0x14

boost::too_many_args: format-string refered to less arguments than were passed

***Dont worry, that was planned

boost::too_few_args: format-string refered to more arguments than were passed

***Dont worry, that was planned

Everything went OK, exiting.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航