博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于标准库中的ptr_fun/binary_function/bind1st/bind2nd
阅读量:4040 次
发布时间:2019-05-24

本文共 1426 字,大约阅读时间需要 4 分钟。

转自:

以前使用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 ));



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

bool
 print(
int
 i, 
int
 j) 
{
    std::cout
<<
 i 
<<
 
"
---
"
 
<<
 j 
<<
 std::endl; 
    
return
 i
>
j;
}
int
 main(
int
 argc, 
char
 
*
argv[])
{
    (std::bind1st(print, 
2
))(
1
);
    
return
 
0
;
}
满怀希望它能够打印

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。
于是修改代码:
int
 main(
int
 argc, 
char
 
*
argv[])
{
    (std::bind1st(std::ptr_fun(print), 
2
))(
1
);
    
return
 
0
;
}
打印结果如下:
2---1

转载地址:http://wrtdi.baihongyu.com/

你可能感兴趣的文章
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>