zoukankan      html  css  js  c++  java
  • [BOOST] BOOST::Format

    cout << format( "%1% says \"%2%\" to %1%.\n" ) % "Yousen" % "Hello";


    这句话将在标准输出上输出“Yousen says "Hello" to Yousen.”
    接下来简单说明一下format的用法。估计聪明人都猜到了,在格式化字符串中,“%1%”(不带引号,后称占位符)表示后面跟的第一个参数,“%2%”则表示第二个,以此类推——注意:占位符是从1开始计数,兄弟们别记错了。后面的“%”(当然也不带引号)操作符的意思么……这是format类(千万别把它当作是个函数)重载的操作符,用来替换格式化字符串中的占位符。
    刚才说了,format是个类,确切的说format是这样定义的:

    typedef basic_format<char> format;

    看清楚了哦,要想用unicode(宽字符)版的format,就用wformat。

    typedef basic_format<wchar_t> wformat;


    现在来试试format的实例:

    #include <boost/format.hpp>
    #include <iostream>
    #include <string>

    using namespace std;
    using namespace boost;

    int main()
    {
     format fmt( "%2% says \"%1%\"." );
     fmt % "Yousen";
     fmt % "Hello";
     string str = fmt.str();
     cout << "string from fmt: " << str << endl;
     cout << "fmt: " << fmt << endl;
    }


    输出:

    string from fmt: Hello says "Yousen".
    fmt: Hello says "Yousen".


    假如已经有一个format对象了,想要改变格式化字符串,调用format::parse方法。如:

    format fmt;
    fmt.parse( "%1% %2%" );


    在获取fmt输出之前,若是参数不足或者多余格式化字符串所指定的数量,则可能会抛出下列异常:

    bad_format_string
    too_few_args
    too_many_args
    out_of_range

    这些都是format_error类的派生类,format_error则派生于std::exception类。

    上面举例的format格式字符串都是非常简单的。format实际上提供了非常强大的格式化控制。这是格式化字符串中占位符的完整语法:

    N$ ] [ flags ] [ width ] [ . precision ] type-char


    其中N为参数序号,从1开始计数;flags是格式控制标志;width为格式化输出宽度,.precision为显示小数点后面位数;type-char为输出类型控制符——除了序号,其他内容和printf中的一样。不罗嗦了。自己看后面的参考站点。
    注意前面有个%,如果用简单模式(仅表示参数序号),后面也得跟上一个%。
    除此之外,format也兼容prinf风格格式化字符串,但是不能和format自己的格式化字符串混用。如“%s says %2%”这样是不行滴,运行时会抛出异常。还有,在使用printf风格字符串时,所有跟进的参数都将顺序替换占位符。
    最后一点是关于用户自定义类的格式化,原则上,只要定义了相应的流输出(operator<<(std::ostream,...))操作符,就能够被format所支持。而且假如指定了详细的格式,format则会尽可能的去实现。也不罗嗦了,洗澡睡觉!

    其他详细情况则参考:http://www.boost.org/libs/format/doc/format.html

  • 相关阅读:
    SpringMVC+bootstrap-fileinput文件上传插件使用入门
    [Java]实现Comparable接口不严谨导致Comparison method violates its general contract!
    2021寒假ACM集训队第一次训练-搜索(一)
    第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛-热身赛
    2021蓝桥杯第三次训练赛
    2021年蓝桥杯第二次训练赛
    2021年蓝桥杯第一次训练赛
    HDU 1312 Red and Black
    HDU 1010 Tempter of the Bone
    HDU 3500 Fling
  • 原文地址:https://www.cnblogs.com/bouygues/p/4479997.html
Copyright © 2011-2022 走看看