源碼:
template<class OP1,class OP2,class OP3>
class compose_f_gx_hy_t
:public binary_function<typename OP2::argument_type,
typename OP3::argument_type,
typename OP1::result_type>
{
private:
OP1 op1;
OP2 op2;
OP3 op3;
public:
compose_f_gx_hy_t( const OP1& o1,const OP2& o2,const OP3& o3 ):op1( o1 ),op2( o2 ),op3(o3){}
typename OP1::result_type
operator()( const typename OP2::argument_type& x,const typename OP3::argument_type& y ) const
{
return op1( op2(x),op3(y) );
}
};
template<class OP1,class OP2,class OP3>
inline compose_f_gx_hy_t<OP1,OP2,OP3>
compose_f_gx_hy( const OP1& o1,const OP2& o2,const OP3& o3 )
{
return compose_f_gx_hy_t<OP1,OP2,OP3>( o1,o2,o3 );
}
int main()
{
string s("Internationalization");
string sub( "Nation" );
string::iterator pos = search( s.begin(),s.end(),sub.begin(),sub.end(),
compose_f_gx_hy( equal_to<int>(),ptr_fun(::toupper),ptr_fun(::toupper)) );
copy( sub.begin(),sub.end(),ostream_iterator<char>( cout,"" ) );
system( "pause" );
return 0;
}
說明:
◆ 函數實現的是f(g(x))形式.
◆compose_f_gx_t繼承自unary_function<typename OP2::argument_type,typename OP1::result_type>其實現為:template<class _Arg,class _Result>struct unary_function{// base class for unary functionstypedef _Arg argument_type;typedef _Result result_type;};
◆ 注意最後在調用的時候是調用函數模板compose_f_gx.之所以調用這個函數而非直接調用compose_f_gx_t仿函數,原因是std::binder2nd<std::multiplies<int> >是一個數值,而非類型.經過函數的轉換之後就能通過編譯器了.
有了這個compose_f_gx_t,compose_f_gx_hx_t就很容易了.另外需要注意的是:如果是使用後者,則提供的第一個參數必須是兩個參數的函數.
下面是二元組合函數配接器示例:
template<class OP1,class OP2,class OP3>
class compose_f_gx_hy_t
:public binary_function<typename OP2::argument_type,
typename OP3::argument_type,
typename OP1::result_type>
{
private:
OP1 op1;
OP2 op2;
OP3 op3;
public:
compose_f_gx_hy_t( const OP1& o1,const OP2& o2,const OP3& o3 ):op1( o1 ),op2( o2 ),op3(o3){}
typename OP1::result_type
operator()( const typename OP2::argument_type& x,const typename OP3::argument_type& y ) const
{
return op1( op2(x),op3(y) );
}
};
template<class OP1,class OP2,class OP3>
inline compose_f_gx_hy_t<OP1,OP2,OP3>
compose_f_gx_hy( const OP1& o1,const OP2& o2,const OP3& o3 )
{
return compose_f_gx_hy_t<OP1,OP2,OP3>( o1,o2,o3 );
}
int main()
{
string s("Internationalization");
string sub( "Nation" );
string::iterator pos = search( s.begin(),s.end(),sub.begin(),sub.end(),
compose_f_gx_hy( equal_to<int>(),ptr_fun(::toupper),ptr_fun(::toupper)) );
copy( sub.begin(),sub.end(),ostream_iterator<char>( cout,"" ) );
system( "pause" );
return 0;
}
摘自 yuanweihuayan的專欄