6) 创建一元函数/二元函数functionCreater [原创,泛型编程,自由下载转载,需注明出处]

源代码可以在我的资源中去下载(包括用法测试的源代码):
http://download.csdn.net/detail/tonny0832/7426991
只需要用VS建一个空的工程,然后引入我的测试头文件即可。然后测试函数会在main函数之前运行,在控制台窗口中可以看到输出。


这个文件是和将多元函数转换为一元函数unaryFunctionConverter配合使用的,unaryFunctionConverter提供了转换的实现,但是使用起来不便,此文件functionCreater将这些转换封装成了makeUnaryFunction/makeBinaryFunction以方便使用,使用者只需要提供函数指针及必要的传入参数即可创建正确的一元/二元函数对象、


#ifndef functorCreater_h__
#define functorCreater_h__
/********************************************************************
created: 2014-1-9   15:35
author: Shen Tony

purpose: helper to create binary function , avoid writing complex template struct/class
                create interface to convert (global /member) function into unary function ,this function supports 5 parameters dynamical at most. e.g.
                R (*)(P1);
                R (*)(P1,P2);
                R (*)(P1,P2,P3);
                R (*)(P1,P2,P3,P4);
                R (*)(P1,P2,P3,P4,P5);
                R (O::*)(P1);
                R (O::*)(P1,P2);
                R (O::*)(P1,P2,P3);
                R (O::*)(P1,P2,P3,P4);
                R (O::*)(P1,P2,P3,P4,P5);


                UnaryFunction<F,x> : No.x parameter of functor F is input parameter in every call.
                FunctorParams<F>::Return_T is the return type of every calling
*********************************************************************/
#include "function.h"


namespace UtilExt
{
    /// binary function creator /
    template<typename TP1 ,typename TP2, typename R>
    BinaryFunction<R (*)(TP1,TP2)> makeBinaryFunction( R (*f)(TP1,TP2) )
    {
        return BinaryFunction<R (*)(TP1,TP2)>(f);
    }


    template<typename O,typename TP1 ,typename TP2, typename R>
    BinaryFunction<R (O::*)(TP1,TP2)> makeBinaryFunction(TPP(O) obj, R (O::*f)(TP1,TP2) )
    {
        return BinaryFunction<R (*)(TP1,TP2)>(obj,f);
    }


    /// unary function creator //
    template<typename F,int Idx> struct UnaryFunctionCreater;
    template<typename F> struct UnaryFunctionCreater<F,0> : public CreateUnaryFunctionImpl<F> { };
    template<typename F> struct UnaryFunctionCreater<F,1> : public CreateUnaryFunctionImpl<F> { };
    template<typename F> struct UnaryFunctionCreater<F,2> : public CreateUnaryFunctionImpl<F> { };
    template<typename F> struct UnaryFunctionCreater<F,3> : public CreateUnaryFunctionImpl<F> { };
    template<typename F> struct UnaryFunctionCreater<F,4> : public CreateUnaryFunctionImpl<F> { };
    template<typename F> struct UnaryFunctionCreater<F,5> : public CreateUnaryFunctionImpl<F> { };


    //member function
    template<typename R,typename O> 
    static UnaryFunction<R(O::*)(),0> makeUnaryFunction(R(O::*f)(),_)  { return UnaryFunctionCreater<R(O::*)(),0>::create(f,_$); };
    template<typename R,typename O,typename TP1> 
    static UnaryFunction<R(O::*)(TP1),0> makeUnaryFunction(R(O::*f)(TP1),_,TPP(TP1) p1)  { return UnaryFunctionCreater<R(O::*)(TP1),0>::create(f,_$,p1); };
    template<typename R,typename O,typename TP1,typename TP2> 
    static UnaryFunction<R(O::*)(TP1,TP2),0> makeUnaryFunction(R(O::*f)(TP1,TP2),_,TPP(TP1) p1,TPP(TP2) p2)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2),0>::create(f,_$,p1,p2); };
    template<typename R,typename O,typename TP1,typename TP2,typename TP3> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3),0> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3),_,TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3),0>::create(f,_$,p1,p2,p3); };
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4),0> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4),_,TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3,TPP(TP4) p4)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4),0>::create(f,_$,p1,p2,p3,p4); };
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4,TP5),0> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4,TP5),_,TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3,TPP(TP4) p4,TPP(TP5) p5)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4,TP5),0>::create(f,_$,p1,p2,p3,p4,p5); };


    template<typename R,typename O,typename TP1> 
    static UnaryFunction<R(O::*)(TP1),1> makeUnaryFunction(R(O::*f)(TP1),TPP(O) p0,_)  { return UnaryFunctionCreater<R (O::*)(TP1),1>::create(f,p0,_$); };
    template<typename R,typename O,typename TP1,typename TP2> 
    static UnaryFunction<R(O::*)(TP1,TP2),1> makeUnaryFunction(R(O::*f)(TP1,TP2),TPP(O) p0,_,TPP(TP2) p2)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2),1>::create(f,p0,_$,p2); };
    template<typename R,typename O,typename TP1,typename TP2,typename TP3> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3),1> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3),TPP(O) p0,_,TPP(TP2) p2,TPP(TP3) p3)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3),1>::create(f,p0,_$,p2,p3); };
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4),1> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4),TPP(O) p0,_,TPP(TP2) p2,TPP(TP3) p3,TPP(TP4) p4)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4),1>::create(f,p0,_$,p2,p3,p4); };    
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4,TP5),1> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4,TP5),TPP(O) p0,_,TPP(TP2) p2,TPP(TP3) p3,TPP(TP4) p4,TPP(TP5) p5)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4,TP5),1>::create(f,p0,_$,p2,p3,p4,p5); };


    template<typename R,typename O,typename TP1,typename TP2> 
    static UnaryFunction<R(O::*)(TP1,TP2),2> makeUnaryFunction(R(O::*f)(TP1,TP2),TPP(O) p0,TPP(TP1) p1,_)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2),2>::create(f,p0,p1,_$); };
    template<typename R,typename O,typename TP1,typename TP2,typename TP3> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3),2> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3),TPP(O) p0,TPP(TP1) p1,_,TPP(TP3) p3)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3),2>::create(f,p0,p1,_$,p3); };
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4),2> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4),TPP(O) p0,TPP(TP1) p1,_,TPP(TP3) p3,TPP(TP4) p4)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4),2>::create(f,p0,p1,_$,p3,p4); };    
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4,TP5),2> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4,TP5),TPP(O) p0,TPP(TP1) p1,_,TPP(TP3) p3,TPP(TP4) p4,TPP(TP5) p5)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4,TP5),2>::create(f,p0,p1,_$,p3,p4,p5); };


    template<typename R,typename O,typename TP1,typename TP2,typename TP3> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3),3> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3),TPP(O) p0,TPP(TP1) p1,TPP(TP2) p2,_)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3),3>::create(f,p0,p1,p2,_$); };
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4),3> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4),TPP(O) p0,TPP(TP1) p1,TPP(TP2) p2,_,TPP(TP4) p4)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4),3>::create(f,p0,p1,p2,_$,p4); };    
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4,TP5),3> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4,TP5),TPP(O) p0,TPP(TP1) p1,TPP(TP2) p2,_,TPP(TP4) p4,TPP(TP5) p5)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4,TP5),3>::create(f,p0,p1,p2,_$,p4,p5); };


    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4),4> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4),TPP(O) p0,TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3,_)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4),4>::create(f,p0,p1,p2,p3,_$); };    
    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4,TP5),4> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4,TP5),TPP(O) p0,TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3,_,TPP(TP5) p5)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4,TP5),4>::create(f,p0,p1,p2,p3,_$,p5); };


    template<typename R,typename O,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(O::*)(TP1,TP2,TP3,TP4,TP5),5> makeUnaryFunction(R(O::*f)(TP1,TP2,TP3,TP4,TP5),TPP(O) p0,TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3,TPP(TP4) p4,_)  { return UnaryFunctionCreater<R(O::*)(TP1,TP2,TP3,TP4,TP5),5>::create(f,p0,p1,p2,p3,p4,_$); };


    //non-member function
    template<typename R,typename TP1> 
    static UnaryFunction<R(*)(TP1),1> makeUnaryFunction(R(*f)(TP1),_)  { return UnaryFunctionCreater<R(*)(TP1),1>::create(f,_$); };
    template<typename R,typename TP1,typename TP2> 
    static UnaryFunction<R(*)(TP1,TP2),1> makeUnaryFunction(R(*f)(TP1,TP2),_,TPP(TP2) p2)  { return UnaryFunctionCreater<R(*)(TP1,TP2),1>::create(f,_$,p2); };
    template<typename R,typename TP1,typename TP2,typename TP3> 
    static UnaryFunction<R(*)(TP1,TP2,TP3),1> makeUnaryFunction(R(*f)(TP1,TP2,TP3),_,TPP(TP2) p2,TPP(TP3) p3)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3),1>::create(f,_$,p2,p3); };
    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4),1> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4),_,TPP(TP2) p2,TPP(TP3) p3,TPP(TP4) p4)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4),1>::create(f,_$,p2,p3,p4); };    
    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4,TP5),1> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4,TP5),_,TPP(TP2) p2,TPP(TP3) p3,TPP(TP4) p4,TPP(TP5) p5)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4,TP5),1>::create(f,_$,p2,p3,p4,p5); };


    template<typename R,typename TP1,typename TP2> 
    static UnaryFunction<R(*)(TP1,TP2),2> makeUnaryFunction(R(*f)(TP1,TP2),TPP(TP1) p1,_)  { return UnaryFunctionCreater<R(*)(TP1,TP2),2>::create(f,p1,_$); };
    template<typename R,typename TP1,typename TP2,typename TP3> 
    static UnaryFunction<R(*)(TP1,TP2,TP3),2> makeUnaryFunction(R(*f)(TP1,TP2,TP3),TPP(TP1) p1,_,TPP(TP3) p3)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3),2>::create(f,p1,_$,p3); };
    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4),2> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4),TPP(TP1) p1,_,TPP(TP3) p3,TPP(TP4) p4)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4),2>::create(f,p1,_$,p3,p4); };    
    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4,TP5),2> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4,TP5),TPP(TP1) p1,_,TPP(TP3) p3,TPP(TP4) p4,TPP(TP5) p5)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4,TP5),2>::create(f,p1,_$,p3,p4,p5); };


    template<typename R,typename TP1,typename TP2,typename TP3> 
    static UnaryFunction<R(*)(TP1,TP2,TP3),3> makeUnaryFunction(R(*f)(TP1,TP2,TP3),TPP(TP1) p1,TPP(TP2) p2,_)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3),3>::create(f,p1,p2,_$); };
    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4),3> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4),TPP(TP1) p1,TPP(TP2) p2,_,TPP(TP4) p4)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4),3>::create(f,p1,p2,_$,p4); };    
    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4,TP5),3> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4,TP5),TPP(TP1) p1,TPP(TP2) p2,_,TPP(TP4) p4,TPP(TP5) p5)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4,TP5),3>::create(f,p1,p2,_$,p4,p5); };


    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4),4> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4),TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3,_)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4),4>::create(f,p1,p2,p3,_$); };    
    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4,TP5),4> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4,TP5),TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3,_,TPP(TP5) p5)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4,TP5),4>::create(f,p1,p2,p3,_$,p5); };


    template<typename R,typename TP1,typename TP2,typename TP3,typename TP4,typename TP5> 
    static UnaryFunction<R(*)(TP1,TP2,TP3,TP4,TP5),5> makeUnaryFunction(R(*f)(TP1,TP2,TP3,TP4,TP5),TPP(TP1) p1,TPP(TP2) p2,TPP(TP3) p3,TPP(TP4) p4,_)  { return UnaryFunctionCreater<R(*)(TP1,TP2,TP3,TP4,TP5),5>::create(f,p1,p2,p3,p4,_$); };


}


#endif // functorCreater_h__

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值