C++ Boost Format超详细讲解

Boost.Format

Boost.Format 提供了函数 std::printf() 的替代品。 std::printf() 源自 C 标准并允许格式化数据输出。但是,它既不是类型安全的,也不是可扩展的。 Boost.Format 提供了一种类型安全且可扩展的替代方案。

Boost.Format 提供了一个名为 boost::format 的类,该类在 boost/format.hpp 中定义。与 std::printf() 类似,将包含用于控制格式的特殊字符的字符串传递给 boost::format 的构造函数。替换输出中这些特殊字符的数据通过运算符 operator% 链接。

示例 7.1。使用 boost::format 格式化输出

#include <boost/format.hpp>
#include <iostream>
int main()
{
  std::cout << boost::format{"%1%.%2%.%3%"} % 12 % 5 % 2014 << '\n';
}

Boost.Format 格式字符串使用放置在两个百分号之间的数字作为实际数据的占位符,这些数据将使用 operator% 进行链接。示例 7.1 使用数字 12、5 和 2014 作为数据创建格式为 12.5.2014 的日期字符串。为了使月份出现在日期的前面,这在美国很常见,可以交换占位符。示例 7.2 进行了此更改,显示 2014 年 5 月 12 日

示例 7.2。带有 boost::format 的编号占位符

#include <boost/format.hpp>
#include <iostream>
int main()
{
  std::cout << boost::format{"%2%/%1%/%3%"} % 12 % 5 % 2014 << '\n';
}

为了使用操纵器格式化数据,Boost.Format 提供了一个名为 boost::io::group() 的函数。

示例 7.3。使用带有 boost::io::group() 的操纵器

#include <boost/format.hpp>
#include <iostream>
int main()
{
  std::cout << boost::format{"%1% %2% %1%"} %
    boost::io::group(std::showpos, 1) % 2 << '\n';
}

Example7.3

示例 7.3 对将与“%1%”关联的值使用操纵器 std::showpos()。因此,此示例将显示 +1 2 +1 作为输出。因为操纵器 std::showpos() 已使用 boost::io::group() 链接到第一个数据值,所以只要显示该值,就会自动添加加号。在这种情况下,格式占位符“%1%”会使用两次。

如果加号仅应显示为 1 的第一个输出,则需要自定义格式占位符。

示例 7.4。带有特殊字符的占位符

#include <boost/format.hpp>
#include <iostream>
int main()
{
  std::cout << boost::format{"%|1$+| %2% %1%"} % 1 % 2 << '\n';
}

Example7.4

​​​ 示例 7.4 就是这样做的。在此示例中,占位符“%1%”的第一个实例被替换为“%|1$+|”。格式的定制不仅仅是添加两个额外的管道符号。对数据的引用也放在管道符号之间,并使用“1$”而不是“1%”。这是将输出修改为 +1 2 1 所必需的。您可以在 Boost 文档中找到有关格式规范的详细信息。 必须为所有占位符或不指定对数据的占位符引用。示例 7.5 仅提供三个占位符之一的引用,这会在运行时生成错误。

示例 7.5。 boost::io::format_error 以防出错

#include <boost/format.hpp>
#include <iostream>
int main()
{
  try
  {
    std::cout << boost::format{"%|+| %2% %1%"} % 1 % 2 << '\n';
  }
  catch (boost::io::format_error &ex)
  {
    std::cout << ex.what() << '\n';
  }
}

Example7.5

示例 7.5 引发了 boost::io::format_error 类型的异常。严格来说,Boost.Format 会抛出 boost::io::bad_format_string。但是,由于不同的异常类都是从 boost::io::format_error 派生的,因此通常更容易捕获这种类型的异常。

示例 7.6 展示了如何在不使用格式字符串中的引用的情况下编写程序。

示例 7.6。没有数字的占位符

#include <boost/format.hpp>
#include <iostream>
int main()
{
  std::cout << boost::format{"%|+| %|| %||"} % 1 % 2 % 1 << '\n';
}

在这种情况下,可以安全地省略第二个和第三个占位符的管道符号,因为它们没有指定任何格式。生成的语法与 std::printf() 非常相似(参见示例 7.7)。

示例 7.7。 boost::format 使用来自 std::printf() 的语法

#include <boost/format.hpp>
#include <iostream>
int main()
{
  std::cout << boost::format{"%+d %d %d"} % 1 % 2 % 1 << '\n';
}

虽然格式可能看起来像 std::printf() 使用的格式,但 Boost.Format 提供了类型安全的优势。格式字符串中的字母“d”不表示数字的输出。相反,它将操纵器 std::dec() 应用于 boost::format 使用的内部流对象。这使得指定对 std::printf() 没有意义的格式字符串成为可能,并且会导致崩溃。

示例 7.8。 boost::format 带有看似无效的占位符

#include <boost/format.hpp>
#include <iostream>
int main()
{
  std::cout << boost::format{"%+s %s %s"} % 1 % 2 % 1 << '\n';
}

std::printf() 只允许 const char* 类型的字符串使用字母“s”。使用 std::printf() 时,“%s”和数值的组合会失败。但是,示例 7.8 完美运行。 Boost.Format 不需要字符串。相反,它应用适当的操纵器来配置内部流。

Boost.Format 既是类型安全的又是可扩展的。只要运算符 operator<< 为 std::ostream 重载,任何类型的对象都可以与 Boost.Format 一起使用。

示例 7.9。 boost::format 具有用户定义的类型

#include <boost/format.hpp>
#include <string>
#include <iostream>
struct animal
{
  std::string name;
  int legs;
};
std::ostream &operator<<(std::ostream &os, const animal &a)
{
  return os << a.name << ',' << a.legs;
}
int main()
{
  animal a{"cat", 4};
  std::cout << boost::format{"%1%"} % a << '\n';
}

Example7.9

示例 7.9 使用 boost::format 将用户定义类型动物的对象写入标准输出。这是可能的,因为流运算符对于动物来说是重载的。

到此这篇关于C++ Boost Format超详细讲解的文章就介绍到这了,更多相关C++ Boost Format内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ Boost Chrono实现计时码表流程详解

    目录 一.Boost.Chrono说明 二.示例代码 一.Boost.Chrono说明 库 Boost.Chrono 提供了多种时钟.例如,您可以获取当前时间,也可以测量流程中经过的时间. Boost.Chrono 的部分内容已添加到 C++11.如果您的开发环境支持 C++11,您可以访问头文件 chrono.xml 中定义的多个时钟.但是,C++11 不支持某些功能,例如用于测量 CPU 时间的时钟.此外,只有 Boost.Chrono 支持用户定义的时间输出格式. 二.示例代码 您可以通过

  • C++ Boost Xpressive示例分析使用

    目录 一.综述 二.应用示例 2.1 示例 9.1 2.2 示例 9.2 2.3 示例 9.3 2.4 示例 9.4 一.综述 与 Boost.Regex 一样,Boost.Xpressive 提供了使用正则表达式搜索字符串的函数.然而,Boost.Xpressive 使得将正则表达式写成 C++ 代码而不是字符串成为可能.这使得在编译时检查正则表达式是否有效成为可能. 只有 Boost.Regex 被合并到 C++11 中.标准库不支持将正则表达式编写为 C++ 代码. boost/xpres

  • C++ Boost shared_ptr共享指针详细讲解

    目录 一.提要 二.智能指针boost::shared_ptr与boost::scoped_ptr 三.智能指针 boost::shared_ptr用法 示例1 示例2 示例3 示例4 示例5 一.提要 boost::shared_ptr是另一个智能指针,与 boost::scoped_ptr有很大不同,本文阐述这种区别. 二.智能指针boost::shared_ptr与boost::scoped_ptr 主要区别在于: boost::shared_ptr 不一定是对象的独占所有者. 所有权可以

  • C++ Boost StringAlgorithms超详细讲解

    目录 一.提要 二.简化字符串处理的工具和其库 三.应用Boost.StringAlgrithms库 3.1 字符大小写 3.2 删除字符串内子串 3.3 查找字符串内子串 3.4 合并字符串 3.5 子串替换 3.6 字符串修剪 3.7 创立谓词 3.8 比较 3.9 拆分字符串 3.10 查找字符串 练习 一.提要 boost C++对应的字符串对象也有一套标准操作方法.本文介绍库Boost.StringAlgorithms的若干函数和功能示例. 二.简化字符串处理的工具和其库 Boost.

  • C++ Boost weak_ptr智能指针超详细讲解

    目录 一.提要 二.特别智能指针(Special Smart Pointers) 一.提要 在 C++11 中,boost::weak_ptr是另一类智能指针,一般是用COM组件生成.调用,本文阐述这种指针的特点和用法. 二.特别智能指针(Special Smart Pointers) 到目前为止介绍的每个智能指针都可以在不同的场景中单独使用.但是,boost::weak_ptr 仅在与 boost::shared_ptr 结合使用时才有意义. boost::weak_ptr 在 boost/w

  • C++ Boost ScopeExit超详细讲解

    目录 一.提要 二.退出作用域(Boost.ScopeExit) 2.1 范例1.UsingBOOST_SCOPE_EXIT 2.2 示例2.Boost.ScopeExit和C++11的lambda函数 2.3 示例3.特点BOOST_SCOPE_EXIT 三.练习 一.提要 资源有很多种,每种都封装一套,还是挺繁琐的!对于比较少使用或者一个程序很可能只会用一次的资源,我们不想封装,在这种情况下用Boost.ScopeExit. 二.退出作用域(Boost.ScopeExit) 库 Boost.

  • C++ Boost实现数字与字符串转化详解

    目录 一.引言 二.Boost.LexicalCast 2.1 示例1 2.2 示例2 三.lexical_cast与c/c++提供类似接口的比较 3.1 两者比较 3.2 样例 一.引言 在boost库中,有一个函数Boost.LexicalCast可以将数字和字符串进行双向转换.本文介绍这种用法的案例. 二.Boost.LexicalCast Boost.LexicalCast 提供了一个转换运算符,boost::lexical_cast,它可以将数字从字符串转换为数字类型,例如 int 或

  • C++ Boost Format超详细讲解

    Boost.Format Boost.Format 提供了函数 std::printf() 的替代品. std::printf() 源自 C 标准并允许格式化数据输出.但是,它既不是类型安全的,也不是可扩展的. Boost.Format 提供了一种类型安全且可扩展的替代方案. Boost.Format 提供了一个名为 boost::format 的类,该类在 boost/format.hpp 中定义.与 std::printf() 类似,将包含用于控制格式的特殊字符的字符串传递给 boost::

  • C++ Boost Lockfree超详细讲解使用方法

    目录 一.说明 二.示例和代码 Boost.Lockfree 一.说明 Boost.Lockfree 提供线程安全和无锁容器.可以从多个线程访问此库中的容器,而无需同步访问. 在 1.56.0 版本中,Boost.Lockfree 只提供了两个容器:boost::lockfree::queue 类型的队列和 boost::lockfree::stack 类型的栈.对于队列,可以使用第二个实现:boost::lockfree::spsc_queue.此类针对只有一个线程写入队列和只有一个线程从队列

  • C++ Boost System超详细讲解

    目录 一.说明 二.关于 Boost.System库 一.说明 以下库支持错误处理. Boost.System 提供类来描述和识别错误.自 C++11 以来,这些类已成为标准库的一部分. Boost.Exception 使得在抛出异常后附加数据成为可能. 二.关于 Boost.System库 Boost.System Boost.System 是一个库,本质上定义了四个类来识别错误.所有四个类都已添加到 C++11 的标准库中.如果您的开发环境支持 C++11,则无需使用 Boost.Syste

  • C++ Boost Uuid超详细讲解

    目录 一.说明 二.Boost.Uuid库示例和代码 一.说明 Boost.Uuid 为 UUID 提供生成器. UUID 是不依赖于中央协调实例的通用唯一标识符.例如,没有数据库存储所有生成的 UUID,可以检查这些 UUID 是否使用了新的 UUID. UUID 由必须唯一标识组件的分布式系统使用.例如,Microsoft 使用 UUID 来识别 COM 世界中的接口.对于为 COM 开发的新接口,可以轻松分配唯一标识符. UUID 是 128 位数字.存在多种生成 UUID 的方法.例如,

  • C++ Boost Archive超详细讲解

    目录 一.说明 二.关于Archive库 一.说明 对Boost.Serialization库的应用,存在如下内容: Archive Pointers and References Serialization of Class Hierarchy Objects Wrapper Functions for Optimization Boost.Serialization 库可以将 C++ 程序中的对象转换为可以保存和加载以恢复对象的字节序列.有不同的数据格式可用于定义生成字节序列的规则. Boo

  • C++ Boost ProgramOptions超详细讲解

    目录 一.说明 二.示例Boost.ProgramOptions 一.说明 Boost.ProgramOptions Boost.ProgramOptions 是一个可以轻松解析命令行选项的库,例如,控制台应用程序.如果您使用图形用户界面开发应用程序,命令行选项通常并不重要. 要使用 Boost.ProgramOptions 解析命令行选项,需要以下三个步骤: 定义命令行选项.您给它们命名并指定哪些可以设置为一个值.如果命令行选项被解析为键/值对,您还可以设置值的类型——例如,它是字符串还是数字

  • C++ Boost Utility超详细讲解

    目录 一.说明 二.Boost.Utility库示例和代码 一.说明 Boost.Utility 库是杂项.有用的类和函数的集合,它们太小而无法在独立库中维护.虽然实用程序很小并且可以快速学习,但它们完全无关.与其他章节中的示例不同,此处的代码示例不是相互构建的,因为它们是独立的实用程序. 虽然大多数实用程序都在 boost/utility.hpp 中定义,但有些实用程序有自己的头文件.以下示例包括所介绍的实用程序的相应头文件. 二.Boost.Utility库示例和代码 示例 69.1.使用

  • C++ Boost Assign超详细讲解

    目录 说明 Exercise 说明 Boost.Assign Boost.Assign 库提供了帮助函数来初始化容器或向容器添加元素.如果需要将许多元素存储在一个容器中,这些函数尤其有用.多亏了 Boost.Assign 提供的函数,您不需要重复调​​用像 push_back() 这样的成员函数来将元素一个一个地插入到容器中. 如果您使用支持 C++11 的开发环境,则可以从初始化列表中获益.通常您可以将任意数量的值传递给构造函数来初始化容器.多亏了初始化列表,你不必依赖 C++11 的 Boo

  • C++ Boost Exception超详细讲解

    Boost.Exception 库提供了一种新的异常类型 boost::exception,它允许您在抛出异常后将数据添加到异常中.此类型在 boost/exception/exception.hpp 中定义.由于 Boost.Exception 将其类和函数分布在多个头文件中,以下示例访问主头文件 boost/exception/all.hpp 以避免一个接一个地包含头文件. Boost.Exception 支持 C++11 标准的机制,该机制将异常从一个线程传输到另一个线程. boost::

随机推荐