程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 配接器compose_f_gx,compose_f_gx_hy實現實例

配接器compose_f_gx,compose_f_gx_hy實現實例

編輯:C++入門知識


源碼: 
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的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved