boost 的 format 库

#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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值