C++ Boost Bind库示例分析使用

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

一、说明Boost.Bind

Boost.Bind 是一个库,它简化和概括了最初需要 std::bind1st() 和 std::bind2nd() 的功能。这两个函数被添加到 C++ 98 的标准库中,即使它们的签名不兼容,也可以连接函数。

二、库应用示范

Boost.Bind 被添加到 C++ 11 的标准库中。如果你的开发环境支持C++ 11,你会在头文件中找到函数std::bind()。根据用例,使用 lambda 函数或 Boost.Phoenix 可能比 std :: bind () 或 Boost.Bind 更好。

例 41.1。 std::for_each() 具有兼容功能

#include <vector>
#include <algorithm>
#include <iostream>
void print(int i)
{
  std::cout << i << '\n';
}
int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(), print);
}

std::for_each() 的第三个参数是一个函数或函数对象,它需要一个唯一的参数。在示例 41.1 中,std :: for_each () 将容器 v 中的数字作为唯一参数一个接一个地传递给 print()。

如果你需要传入一个签名不符合算法要求的函数,那就更难了。例如,如果您希望 print() 接受一个输出流作为附加参数,则不能再将其与 std::for_each() 原样使用。

例 41.2。 std :: for_each () 与 std :: bind1st ()

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
class print : public std::binary_function<std::ostream*, int, void>
{
public:
  void operator()(std::ostream *os, int i) const
  {
    *os << i << '\n';
  }
};
int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(), std::bind1st(print{}, &std::cout));
}

与示例 41.1 一样,示例 41.2 将 v 中的所有数字写入标准输出。但是,这一次,输出流作为参数传递给 print()。为此,函数 print() 被定义为从 std::binary_function 派生的函数对象。

使用 Boost.Bind,您无需将 print() 从函数转换为函数对象。相反,您使用在 boost/bind.hpp 中定义的函数模板 boost::bind()。

例 41.3。 std :: for_each () 与 boost :: bind ()

#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
void print(std::ostream *os, int i)
{
  *os << i << '\n';
}
int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(), boost::bind(print, &std::cout, _1));
}

Example41.3

示例 41.3 使用 print() 作为函数,而不是作为函数对象。因为 print() 需要两个参数,所以函数不能直接传递给 std::for_each()。相反,boost::bind() 被传递给 std::for_each() 并且 print() 作为第一个参数被传递给 boost::bind()。

由于 print() 需要两个参数,所以这两个参数也必须传递给 boost::bind()。它们是指向 std :: cout 和 _1 的指针。

_1 是占位符。 Boost.Bind 定义了从 _1 到 _9 的占位符。这些占位符告诉 boost::bind() 返回一个函数对象,该对象期望与具有最大数量的占位符一样多的参数。如果像示例 41.3 中一样,仅使用占位符 _1,则 boost :: bind () 返回一个一元函数对象 - 一个需要唯一参数的函数对象。在这种情况下这是必需的,因为 std :: for_each () 只传递一个参数。

std::for_each() 调用一元函数对象。传递给函数对象的值 - 来自容器 v 的数字 - 占据占位符 _1 的位置。 boost :: bind () 获取数字和指向 std :: cout 的指针并将它们转发给 print ()。

请注意 boost::bind() 和 std::bind1st() 和 std::bind2nd() 一样,都是按值取参数的。为了防止调用程序试图复制 std::cout,print() 需要一个指向流的指针。 Boost.Ref 提供了一个允许您通过引用传递参数的函数。

示例 41.4 说明了如何使用 boost::bind() 定义二进制函数对象。它使用算法std :: sort (),它期望一个二进制函数作为它的第三个参数。

例 41.4。 std :: sort () 与 boost :: bind ()

#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
bool compare(int i, int j)
{
  return i > j;
}
int main()
{
  std::vector<int> v{1, 3, 2};
  std::sort(v.begin(), v.end(), boost::bind(compare, _1, _2));
  for (int i : v)
    std::cout << i << '\n';
}

在示例 41.4 中,创建了一个二进制函数对象,因为使用了占位符 _2。算法 std::sort() 从容器 v 调用这个二进制函数对象,并用两个值计算返回值以对容器进行排序。函数 compare() 被定义为对 v 进行降序排序。 由于 compare() 是二进制函数,所以可以直接传给 std::sort()。但是,使用 boost :: bind () 仍然有意义,因为它允许您更改参数的顺序。

例如,如果您想对容器进行升序排序但不想更改 compare(),则可以使用 boost::bind()。

例 41.5。 std :: sort () 与 boost :: bind () 并更改了占位符的顺序

#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
bool compare(int i, int j)
{
  return i > j;
}
int main()
{
  std::vector<int> v{1, 3, 2};
  std::sort(v.begin(), v.end(), boost::bind(compare, _2, _1));
  for (int i : v)
    std::cout << i << '\n';
}

Example41.5

示例 41.5 简单地通过交换占位符对 v 进行升序排序:首先传递 _2,然后传递 _1。

到此这篇关于C++ Boost Bind库示例分析使用的文章就介绍到这了,更多相关C++ Boost Bind内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Matlab利用垂距法实现提取离散坐标数据特征点

    Matlab利用垂距法实现提取离散坐标数据特征点

    垂距法是指根据中间顶点到其前、后两相邻顶点连线的距离的大小,来确定是否保留该顶点的一种线要素顶点压缩算法。本文将利用这一算法实现提取离散坐标数据特征点,需要的可以参考下
    2022-04-04
  • C++中隐式类型转换学习笔记

    C++中隐式类型转换学习笔记

    在本篇文章里小编给大家整理的是一篇关于C++中隐式类型转换学习笔记内容,有兴趣的跟着小编来学习下吧。
    2020-02-02
  • 枚举和宏的区别详细解析

    枚举和宏的区别详细解析

    枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有,宏不是语言的一部分,它是一种预处理替换符
    2013-09-09
  • C语言中的正则表达式使用示例详解

    C语言中的正则表达式使用示例详解

    正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。本文通过示例代码给大家介绍了C语言中的正则表达式使用,感兴趣的朋友跟随小编一起看看吧
    2019-07-07
  • C++将保存char、int 和double到txt文件中

    C++将保存char、int 和double到txt文件中

    这篇文章主要介绍了C++如何将保存char、int 和double到txt文件中,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言中settimeofday函数和gettimeofday函数的使用

    C语言中settimeofday函数和gettimeofday函数的使用

    这篇文章主要介绍了C语言中的settimeofday函数和gettimeofday函数的使用,注意settimeofday()函数只返回0和-1,需要的朋友可以参考下
    2015-08-08
  • C++之值传递&指针传递&引用传递的示例详解

    C++之值传递&指针传递&引用传递的示例详解

    这篇文章主要为大家详细介绍了C++中值传递、指针传递和引用传递的定义与使用,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
    2022-10-10
  • C语言判断一个数是否为素数方法解析

    C语言判断一个数是否为素数方法解析

    这篇文章主要介绍了C语言判断一个数是否为素数方法,文中通过示例代码介绍的非常详细,对大家的学习具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 浅谈C++中虚函数实现原理揭秘

    浅谈C++中虚函数实现原理揭秘

    下面小编就为大家带来一篇浅谈C++中虚函数实现原理揭秘。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • C++ 使用CRC32检测内存映像完整性的实现步骤

    C++ 使用CRC32检测内存映像完整性的实现步骤

    当我们使用动态补丁的时候,那么内存中同样不存在校验效果,也就无法抵御对方动态修改机器码了,为了防止解密者直接对内存打补丁,我们需要在硬盘校验的基础上,增加内存校验,防止动态补丁的运用。
    2021-06-06

最新评论