http://www.cnblogs.com/shootingstars/archive/2008/11/14/860042.html

以前使用bind1st以及bind2nd很少,后来发现这两个函数还挺好玩的,于是关心上了。
在C++ Primer对于bind函数的描述如下:

绑定器binder通过把二元函数对象的一个实参绑定到一个特殊的值上将其转换成一元函数对象

C++标准库提供了两种预定义的binder 适配器bind1st 和bind2nd 正如你所预料的bind1st 把值绑定到二元函数对象的第一个实参上bind2nd 把值绑定在第二个实参上
例如
为了计数容器中所有小于或等于10 的元素的个数我们可以这样向count_if()传递
count_if( vec.begin(), vec.end(), bind2nd( less_equal<int>(), 10 ));

哦,这倒是挺有意思的。于是依葫芦画瓢:

boolprint(inti, intj) 
{
    std::cout<<i <<"---"<<j <<std::endl; 
    returni>j;
}

intmain(intargc, char*argv[])
{
    (std::bind1st(print, 2))(1);
    return0;

}

满怀希望它能够打印
2---1

只不过。。。编译出错:
1    Error    error C2784: 'std::binder1st<_Fn2> std::bind1st(const _Fn2 &,const _Ty &)' : could not deduce template argument for 'overloaded function type' from 'overloaded function type'    
---不能够推断出模板参数for 'overloaded function type' from 'overloaded function type' 。。。。
(还真看不明白。。。)

于是直接看bind1st代码:

template<class_Fn2,
    class_Ty>inline
    binder1st<_Fn2>bind1st(const_Fn2&_Func, const_Ty&_Left)
        {    
        typename _Fn2::first_argument_type _Val(_Left);
        return(std::binder1st<_Fn2>(_Func, _Val));
        }

嗯。。。在代码里
typename _Fn2::first_argument_type _Val(_Left)
说必须定义first_argument_type类型,可是我一个函数,哪里来的这个类型定义?嗯,STL一定提供了某种东东用来自动定义这个类型。找啊找,于是找到了ptr_fun。
这个函数自动将一个函数指针转换为一个binary_function的继承类pointer_to_binary_function,而在binary_function中定义了first_argument_type。
于是修改代码:

intmain(intargc, char*argv[])
{
    (std::bind1st(std::ptr_fun(print), 2))(1);
    return0;
}

打印结果如下:
2---1

转载于:https://www.cnblogs.com/johnnyflute/p/3714201.html

关于标准库中的ptr_fun/binary_function/bind1st/bind2nd相关推荐

  1. C++标准库中各种排序归纳

    一.简介 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.我们在编程过程中会经常接触到排序,比如游戏中的排行榜等.C++标准库中提供了各种不同的排序算法,这篇博 ...

  2. log包在Golang语言的标准库中是怎么使用的?

    Golang 语言的标准库中提供了一个简单的 log 日志包,它不仅提供了很多函数,还定义了一个包含很多方法的类型 Logger.但是它也有缺点,比如不支持区分日志级别,不支持日志文件切割等. 01. ...

  3. iOS标准库中常用数据结构和算法之内存池

    上一篇:iOS标准库中常用数据结构和算法之位串 ⛲️内存池 内存池提供了内存的复用和持久的存储功能.设想一个场景,当你分配了一块大内存并且填写了内容,但是你又不是经常去访问这块内存.这样的内存利用率将 ...

  4. C++标准库中的随机数生成

    C++标准库中的随机数生成 一.伪随机与真随机 数字计算机的结果可以说是固定的.必然的.都是根据现有数据的状态得出接下来的状态.除非硬件损坏,计算机不会产生真正的随机和无法预料的事.在生活中随手抛一个 ...

  5. iOS标准库中常用数据结构和算法之二叉排序树

    上一篇:iOS标准库中常用数据结构和算法之排序 ?二叉排序树 功能:二叉排序树的标准实现是一颗平衡二叉树.二叉排序树主要用来解决高效插入和高效检索以及进行排序的问题.系统分别提供了二叉排序树节点的查找 ...

  6. Git 源码禁止使用 C 标准库中容易被错用的函数

    Git 项目的源码禁止开发者使用 C 标准库中的某些函数,原因是这些函数太容易被误用,就算使用得当也很容易出问题.因此 Git 的源码增加了一个 banned.h 的头函数,一旦你使用了这些被禁用的函 ...

  7. c/c++标准库中的文件操作总结

    1 stdio.h是c标准库中的标准输入输出库 2 在c++中调用的方法 直接调用即可,但是最好在函数名前面加上::,以示区分类的内部函数和c标准库函数. 3 c标准输入输出库的使用 3.1 核心结构 ...

  8. php spl函数,PHP SPL标准库中的常用函数介绍

    这篇文章主要介绍了PHP SPL标准库中的常用函数介绍,本文着重讲解了spl_autoload_extensions().spl_autoload_register().spl_autoload()三 ...

  9. 细数python标准库中低调的模块

    有没有遇到过这种情况,在网络上搜索如何使用Python进行某种操作,最终找到一个第三方库,直到后来发现标准库中包含的模块或多或少都可以满足你的需求.这种情况并不罕见, 整理了一些python标准库中鲜 ...

最新文章

  1. 华为手机像素密度排行_4500元以上的手机排行,华为P40Pro未上榜,第一你猜到了吗?...
  2. 加号和减号在一起怎么读_孩子粗心大意怎么治?告诉你背后的原因和好用的方法.........
  3. 万字长文总结八大经典内部排序算法
  4. 关于系统自带 .NET Framework 版本的说明
  5. 拆分备份(还原)比较大的数据库为多个bak文件
  6. 思维导图,流程图模板整合
  7. iOS给图片打水印,并将打过水印的图片生成到沙盒中
  8. SecureCRT官方下载地址
  9. 详解springBoot集成activiti7,工作流实战案例(三)
  10. Android软键盘删除键触发Activity的返回事件
  11. 状态机实现的LED交通灯2
  12. CentOS官方免费下载地址,包含CentOS7和CentOS8
  13. 【前沿技术RPA】 一文学会用UiPath实现自动发送电子邮件(Email Automation)
  14. 吃鸡降落伞降落,射线检测,触发销毁降落伞等
  15. 网站推广第一周总结和反思
  16. V-Rep/CoppeliaSim:Steeringwheel_Tutorial手把手教你制作舵轮底盘
  17. zabbix监控mysql主从与主从延迟
  18. 万丈高楼平地起 ——浅谈网格计算基础
  19. 安卓虚拟键盘_像科幻片里那样隔空打字,虚拟键盘会成为未来趋势吗?
  20. CCRC信息安全服务资质认证证书如何申请?

热门文章

  1. 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task1地理数据分析常用工具
  2. 【竞赛算法学习】学术前沿趋势分析-论文数据统计
  3. 数据结构-循环单链表之约瑟夫问题
  4. about quartus, FPGA and verilog 琐记
  5. Valgrind 使用方法
  6. 使用TensorFlow 2.0+和Keras实现AlexNet CNN架构
  7. 上市公司降价200万卖房仍然无人接手,有的甚至降价1900万
  8. 申请信用贷款需要哪些条件?
  9. 异构服务器 微服务_Spring Cloud Alibaba Sidecar 多语言微服务异构
  10. ios 检测是否联网_秋招|阿里 iOS 五轮面经分享,已收到阿里的意向书