C++ Boost Format超详细讲解

 更新时间:2022年11月16日 09:16:20   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言内存函数的实现示例

    C语言内存函数的实现示例

    本文主要介绍了C语言内存函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • C++调用matlab引擎实现三维图的绘制

    C++调用matlab引擎实现三维图的绘制

    这篇文章主要为大家详细介绍了C++如何调用matlab引擎实现三维图的绘制,文中的示例代码讲解详细,对我们学习C++和Matlab有一定的帮助,需要的可以参考一下
    2022-12-12
  • C++设计模式之建造者模式

    C++设计模式之建造者模式

    这篇文章主要介绍了C++设计模式之建造者模式,一个复杂对象是由多个部件组成的,建造者模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示,需要的朋友可以参考下
    2014-09-09
  • C语言通过深度优先搜索来解电梯问题和N皇后问题的示例

    C语言通过深度优先搜索来解电梯问题和N皇后问题的示例

    深度优先搜索即是对一个新发现的节点上如果还关联未探测到的边,就沿此边探测下去,直到发现从原点可达的所有点为止,这里我们就来展示C语言通过深度优先搜索来解电梯问题和N皇后问题的示例
    2016-06-06
  • C++中的string库函数常见函数的作用和使用方法

    C++中的string库函数常见函数的作用和使用方法

    这篇文章主要介绍了C++中的string库函数常见函数的作用和使用方法,库函数的灵活应用是程序员的一大重要技能,本文通过实例实例代码给大家讲解的非常详细,需要的朋友可以参考下
    2022-04-04
  • C语言数据结构之算法的时间复杂度

    C语言数据结构之算法的时间复杂度

    这篇文章主要介绍了C语言数据结构之算法的时间复杂度,文章基于c语言的相关资料展开详细介绍,具有一定的参价值,需要的小伙伴可以参考一下
    2022-05-05
  • C++ Cmake的构建静态库和动态库详解

    C++ Cmake的构建静态库和动态库详解

    这篇文章主要为大家详细介绍了C++ Cmake的构建静态库和动态库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++如何调用matlab函数

    C++如何调用matlab函数

    这篇文章主要介绍了C++如何调用matlab函数的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • Qt编写秒表功能

    Qt编写秒表功能

    这篇文章主要为大家详细介绍了Qt编写秒表功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++ vector容器 find erase的使用操作:查找并删除指定元素

    C++ vector容器 find erase的使用操作:查找并删除指定元素

    这篇文章主要介绍了C++ vector容器 find erase的使用操作:查找并删除指定元素,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05

最新评论