C++ Boost Optional示例超详细讲解

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

一、概述

数据结构类似于容器,因为它们可以存储一个或多个元素。但是,它们与容器不同,因为它们不支持容器通常支持的操作。例如,使用本部分介绍的数据结构,不可能在一次迭代中访问所有元素。

Boost.Optional 可以很容易地标记可选的返回值。使用 Boost.Optional 创建的对象要么是空的,要么包含单个元素。使用 Boost.Optional,您无需使用空指针或 -1 等特殊值来指示函数可能没有返回值。

  • Boost.Tuple 提供了 boost::tuple,这是一个自 C++11 以来一直是标准库的一部分的类。
  • Boost.Any 和 Boost.Variant 允许您创建可以存储不同类型值的变量。 Boost.Any 支持任意类型,Boost.Variant 允许您将需要支持的类型作为模板参数传递。
  • Boost.PropertyTree 提供了一个树状的数据结构。该库通常用于帮助管理配置数据。数据还可以以 JSON 等格式写入文件或从文件中加载。
  • Boost.DynamicBitset 提供了一个类似于 std::bitset 但在运行时配置的类。
  • Boost.Tribool 提供了一种类似于 bool 的数据类型,支持三种状态。
  • Boost.CompressedPair 定义了 boost::compressed_pa​​ir 类,可以替代 std::pair。该类支持所谓的空基类优化。

二、Boost.Optional

库 Boost.Optional 提供类 boost::optional,可用于可选返回值。这些是函数的返回值,可能并不总是返回结果。示例 21.1 说明了在没有 Boost.Optional 的情况下通常如何实现可选返回值。

示例 21.1。表示可选返回值的特殊值

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
int get_even_random_number()
{
  int i = std::rand();
  return (i % 2 == 0) ? i : -1;
}
int main()
{
  std::srand(static_cast<unsigned int>(std::time(0)));
  int i = get_even_random_number();
  if (i != -1)
    std::cout << std::sqrt(static_cast<float>(i)) << '\n';
}

示例 21.1 使用函数 get_even_random_number(),它应该返回一个偶数随机数。它通过调用标准库中的函数 std::rand() 以一种相当幼稚的方式做到这一点。如果 std::rand() 生成偶数随机数,则该数字由 get_even_random_number() 返回。如果生成的随机数是奇数,则返回-1。

在此示例中,-1 表示无法生成偶数随机数。因此,get_even_random_number() 不能保证返回偶数随机数。返回值是可选的。

许多函数使用 -1 之类的特殊值来表示不能返回任何结果。例如,如果找不到子字符串,std::string 类的成员函数 find() 将返回特殊值 std::string::npos。返回值为指针的函数通常返回 0 表示不存在结果。

Boost.Optional 提供了 boost::optional,这使得可以清楚地标记可选的返回值。

示例 21.2。带有 boost::optional 的可选返回值

#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using boost::optional;
optional<int> get_even_random_number()
{
  int i = std::rand();
  return (i % 2 == 0) ? i : optional<int>{};
}
int main()
{
  std::srand(static_cast<unsigned int>(std::time(0)));
  optional<int> i = get_even_random_number();
  if (i)
    std::cout << std::sqrt(static_cast<float>(*i)) << '\n';
}

在示例 21.2 中,get_even_random_number() 的返回值具有一个新类型,boost::optional<int>。 boost::optional 是一个模板,必须使用返回值的实际类型进行实例化。 boost/optional.hpp 必须包含在 boost::optional 中。

如果 get_even_random_number() 生成偶数随机数,则直接返回该值,并自动包装在类型为 boost::optional<int> 的对象中,因为 boost::optional 提供了一个非排他的构造函数。如果 get_even_random_number() 不生成偶数随机数,则返回 boost::optional<int> 类型的空对象。返回值是通过调用默认构造函数创建的。

main() 检查 i 是否为空。如果它不为空,则使用 operator* 访问存储在 i 中的数字。 boost::optional 似乎像指针一样工作。但是,您不应将 boost::optional 视为指针,因为例如,boost::optional 中的值由复制构造函数复制,而指针不会复制其指向的值。

示例 21.3。 boost::optional 的其他有用的成员函数

#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using boost::optional;
optional<int> get_even_random_number()
{
  int i = std::rand();
  return optional<int>{i % 2 == 0, i};
}
int main()
{
  std::srand(static_cast<unsigned int>(std::time(0)));
  optional<int> i = get_even_random_number();
  if (i.is_initialized())
    std::cout << std::sqrt(static_cast<float>(i.get())) << '\n';
}

eExample21.3e

示例 21.3 介绍了 boost::optional 的其他有用的成员函数。此类提供了一个特殊的构造函数,它将条件作为第一个参数。如果条件为真,则使用第二个参数初始化 boost::optional 类型的对象。如果条件为假,则会创建一个 boost::optional 类型的空对象。示例 21.3 在函数 get_even_random_number() 中使用此构造函数。

使用 is_initialized() 您可以检查 boost::optional 类型的对象是否不为空。 Boost.Optional 涉及已初始化和未初始化的对象——因此,成员函数的名称为 is_initialized()。成员函数 get() 等效于 operator*。

示例 21.4。 Boost.Optional 的各种辅助函数

#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace boost;
optional<int> get_even_random_number()
{
  int i = std::rand();
  return make_optional(i % 2 == 0, i);
}
int main()
{
  std::srand(static_cast<unsigned int>(std::time(0)));
  optional<int> i = get_even_random_number();
  double d = get_optional_value_or(i, 0);
  std::cout << std::sqrt(d) << '\n';
}

Boost.Optional 提供独立的辅助函数,例如 boost::make_optional() 和 boost::get_optional_value_or()(参见示例 21.4)。可以调用 boost::make_optional() 来创建 boost::optional 类型的对象。如果您希望在 boost::optional 为空时返回默认值,您可以调用 boost::get_optional_value_or()。

函数 boost::get_optional_value_or() 也作为 boost::optional 的成员函数提供。它被称为 get_value_or()。

除了 boost/optional/optional_io.hpp 之外,Boost.Optional 还提供了一个带有重载流运算符的头文件,让您可以将 boost::optional 类型的对象写入标准输出等。

参考文:

Chapter21.Boost.Optional (theboostcpplibraries.com)

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

相关文章

  • C语言实现销售管理系统设计

    C语言实现销售管理系统设计

    这篇文章主要为大家详细介绍了C语言实现销售管理系统设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言详解分析进程控制中进程终止的实现

    C语言详解分析进程控制中进程终止的实现

    当进程完成执行最后语句并且通过系统调用 exit() 请求操作系统删除自身时,进程终止。这时,进程可以返回状态值(通常为整数)到父进程(通过系统调用 wait())。所有进程资源,如物理和虚拟内存、打开文件和 I/O 缓冲区等,会由操作系统释放
    2022-08-08
  • C语言字符串函数介绍与模拟实现详解

    C语言字符串函数介绍与模拟实现详解

    字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝,计算长度,字符查找等的函数
    2022-02-02
  • Visual Studio 2022下载安装与使用超详细教程

    Visual Studio 2022下载安装与使用超详细教程

    这篇文章主要介绍了Visual Studio 2022最新版安装与使用教程,本文以社区版为例通过图文并茂的形式给大家介绍Visual Studio 2022安装使用,需要的朋友可以参考下
    2022-04-04
  • C++实现单置换密码

    C++实现单置换密码

    这篇文章主要为大家详细介绍了C++实现单置换密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 基于C语言代码实现点餐系统

    基于C语言代码实现点餐系统

    这篇文章主要为大家详细介绍了基于C语言代码实现点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 详解C标准库堆内存函数

    详解C标准库堆内存函数

    在C/C++语言中,我们知道内存分为这几种:程序全局变量内存、栈内存、堆内存。其中堆内存就是通过malloc(new)来分配的内存,本文我们来探讨一下C标准库堆内存函数。
    2021-06-06
  • C语言详细讲解strcpy strcat strcmp函数的模拟实现

    C语言详细讲解strcpy strcat strcmp函数的模拟实现

    这篇文章主要介绍了怎样用C语言模拟实现strcpy与strcat和strcmp函数,strcpy()函数是C语言中的一个复制字符串的库函数,strcat()函数的功能是实现字符串的拼接,strcmp()函数作用是比较字符串str1和str2是否相同
    2022-05-05
  • C语言如何解决约瑟夫环问题

    C语言如何解决约瑟夫环问题

    文章总结了四种解决特定问题的方法,包括单循环链表法、循环数组法、递归法和迭代法,并分享了个人经验
    2024-12-12
  • 数据结构之位图(bitmap)详解

    数据结构之位图(bitmap)详解

    这篇文章主要介绍了数据结构之位图详解,本文讲解了位图的基本知识、位图的实现方法、位图的应用等内容,需要的朋友可以参考下
    2014-08-08

最新评论