关于标准库中的ptr_fun/binary_function/bind1st/bind2nd
来源:互联网 发布:异界之全科技召唤知轩 编辑:程序博客网 时间:2024/06/02 04:42
以前使用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 ));
”
哦,这倒是挺有意思的。于是依葫芦画瓢:
{
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代码:
typename _Fn2::first_argument_type _Val(_Left)
说必须定义first_argument_type类型,可是我一个函数,哪里来的这个类型定义?嗯,STL一定提供了某种东东用来自动定义这个类型。找啊找,于是找到了ptr_fun。
这个函数自动将一个函数指针转换为一个binary_function的继承类pointer_to_binary_function,而在binary_function中定义了first_argument_type。
于是修改代码:
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));
}
嗯。。。在代码里
{
(std::bind1st(std::ptr_fun(print), 2))(1);
return 0;
}
打印结果如下:
2---1
此文转自http://hi.baidu.com/jrckkyy/blog/item/7c1954cdf2d5f4580eb3452d.html
- 关于标准库中的ptr_fun/binary_function/bind1st/bind2nd
- 关于标准库中的ptr_fun/binary_function/bind1st/bind2nd
- 关于标准库中的ptr_fun/binary_function/bind1st/bind2nd
- ptr_fun mem_fun_ref mem_fun bind1st bind2nd
- bind1st & bind2nd
- C++标准库---ptr_fun()
- bind1st bind2nd的使用
- 引用 bind1st bind2nd
- bind1st bind2nd的使用
- bind1st bind2nd的使用
- STL bind1st bind2nd详解
- STL bind1st bind2nd详解
- bind1st bind2nd的使用
- bind1st,bind2nd,not1,not2
- bind2nd 和 bind1st【转】
- bind1st bind2nd详解
- bind1st和bind2nd函数
- bind1st 和 bind2nd 解析
- Android学习笔记10&s3c2440学习系列10
- C语言中的各种百分号都代表什么意思
- 2009年的思考
- jsp页面防刷新,提交数据重复
- Ubuntu实现开机进入命令行
- 关于标准库中的ptr_fun/binary_function/bind1st/bind2nd
- BT 应用框架
- 用ioctl获得本地ip地址
- qt for Windows命令行编译问题
- 演示使用 JACOB : Java COM Bridge 操纵 Word 文档
- 性感美女卖猪肉
- C# Activator.CreateInstance()方法使用
- C#使用operator关键字实现操作符重载
- 开门见山:程序员的三大“美德”