在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 ;
}
满怀希望它能够打印
{
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));
}
嗯。。。在代码里
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 ;
}
打印结果如下:
{
(std::bind1st(std::ptr_fun(print), 2 ))( 1 );
return 0 ;
}
2---1