STL的Binder2nd中的疑问
本帖最后由 qq2399431200 于 2013-05-27 19:22:08 编辑 一个for_each结合bind2nd测试引发的疑问:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
void printElem( int elem, const char* prefix )
{
cout << prefix << elem <<endl;
}
int main( void )
{
int ia[] = { 1, 2, 3 };
vector<int> ivec( ia, ia + sizeof(ia) / sizeof(int) );
for_each( ivec.begin(), ivec.end(), bind2nd( ptr_fun(printElem), "Element:" ) );
return 0;
}
template<class _Fn2> //VS2010中的
class binder2nd : public unary_function<typename _Fn2::first_argument_type, typename _Fn2::result_type>
{// functor adapter _Func(left, stored)
public:
typedef unary_function<typename _Fn2::first_argument_type,typename _Fn2::result_type> _Base;
typedef typename _Base::argument_type argument_type;
typedef typename _Base::result_type result_type;
binder2nd(const _Fn2& _Func, typename _Fn2::second_argument_type& _Right) : op(_Func), value(_Right)
{
// construct from functor and right operand
}
result_type operator()(const argument_type& _Left) const
{
// apply functor to operands
return (op(_Left, value));
}
result_type operator()(argument_type& _Left) const
{// apply functor to operands
return (op(_Left, value));
}
protected:
_Fn2 op;// the functor to apply
typename _Fn2::second_argument_type value;// the right operand
};
// TEMPLATE FUNCTION bind2nd
template<class _Fn2, class _Ty>
inline binder2nd<_Fn2> bind2nd(const _Fn2& _Func, const _Ty& _Right)
{// return a binder2nd functor adapter
typename _Fn2::second_argument_type _Val(_Right);
return (_STD binder2nd<_Fn2>(_Func, _Val)); //返回一个binder2nd的实例
}
template<typename InputIterator, typename Function>
Function for_each(InputIterator beg, InputIterator end, Function f)
{
while(beg != end)
f(*beg++);
//如果f是bind2nd的返回值(返回binger2nd的一个对象),则此处调用binder2nd类重载的result_type operator()(argument_type& _Left) const函数
}
//注:个人理解
f(*beg++);在这个测试环境下等价于
f(*beg++)
{
_Func( *beg++, _Right);
}
STL
[解决办法]
binder2nd之后的函数对象 就是1元类型了,只接受一个参数。
_Fn2::first_argument_type 是使用_Fn2的内嵌类型first_argument_type
先看看专门讲stl的书籍吧,binder2nd 三言两语说不清楚的。
[解决办法]
typeid输出一下类型
cout<<typeid( ptr_fun(printElem)).name()<<endl;