一、配接器定义
配接器没有找到合适的定义,在网上搜到了一下两种说法,作为定义:
1. 配接器是一种设计模式,它在原有类型的基础上扩展成为另一个接口,使原本因为接口不兼容而不能合作的类型可以一起工作。
2. 函数对象直接应用的地方较少,它配合实现一些算法(作为算法的参数),于是便有函数配接器。
二、配接器应用实例
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
int arr[] = {11, 12, 13, 1, 2, 3, 4, 5, 6, 7};
vector<int> vec(arr, arr+10);
cout<<count_if(vec.begin(), vec.end(), bind1st(less<int>(), 10))<<endl; //输出3
cout<<count_if(vec.begin(), vec.end(), bind2nd(less<int>(), 10))<<endl; //输出7
return 1;
};
3.1 bind2nd、binder2nd源码
/*摘自C++ standard STL。*/
// TEMPLATE CLASS binder2nd
template<class _Fn2>
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, const 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));
}
3.2 bind2nd、binder2nd源码说明
1. bind2nd()是辅助函数,为的是使用binder2nd(真正的主角)更方便。
2. count_if(vec.begin(), vec.end(), bind2nd(less<int>(), 10))中less<int>在binder2nd函数对象的构造函数中被作为其内部操作成员(它是一个函数对象)_Fn2 op;
3. count_if()函数在处理每一个元素的时候,实际调用bindeer2nd的"()"运算符重载函数,而这个函数当中又调用了其内部操作成员op(其又是一个函数对象less<int>)的"()"运算符重载函数。 如此一来,配接就成功了。其他的函数配接器做法类似。
总结,count_if()调用bind2nd()函数,bind2nd()函数实际产生binder2nd函数对象,返回给count_if()作为参数,count_if()再调用更为底层的函数_Count_if()函数。
参考资料:
配接器定义:http://www.cnblogs.com/whyandinside/archive/2012/10/14/2723500.html
配接器理解:http://www.cfanz.cn/index.php?c=article&a=read&id=38289
STL的各配接器及其应用:http://www.360doc.com/content/12/1209/14/9290626_253022276.shtml