function 的简单实现

template <typename R, typename Arg>  class  Invoker_Base
{
public:
    virtual  R  operator()(Arg arg) = 0;
};


template <typename R, typename Arg>  class  Function_Ptr_Invoker :
        public  Invoker_Base<R, Arg>
{
private:
    typedef  R (*FUNCTION_TYPE)(Arg);


public:
    Function_Ptr_Invoker(FUNCTION_TYPE  func)
        : m_func(func)
    {
    }


    R  operator ()(Arg arg)
    {
        return (*m_func)(arg);
    }


private:
    FUNCTION_TYPE  m_func;
};


template <typename R, typename Arg, typename T>  class Member_Ptr_Invoker :
        public Invoker_Base<R, Arg>
{
private:
    typedef  R (T::*MEM_FUNC)(Arg);


public:
    Member_Ptr_Invoker(T* object, MEM_FUNC  func)
        : m_func(func)
        , m_object(object)
    {
    }


    R  operator ()(Arg arg)
    {
        return (m_object->*m_func)(arg);
    }


private:
    MEM_FUNC   m_func;
    T*         m_object;
};


template <typename R, typename Arg, typename T>
class  Function_object_invoker : public Invoker_Base<R, Arg>
{
public:
    Function_object_invoker(T  t)
        : m_t(t)
    {


    }


    R  operator()(Arg arg)
    {
        return m_t(arg);
    }


private:
    T  m_t;
};


template <typename R, typename Arg>  class  Function1
{
private:
    typedef  R (*FUNC)(Arg);


public:
    Function1(FUNC func)
        : m_invoker(new  Function_Ptr_Invoker<R, Arg>(func))
    {
    }


    template <typename T>
    Function1(R (T::*mem_func)(Arg), T* object)
        : m_invoker(new Member_Ptr_Invoker<R, Arg, T>(object, mem_func))
    {
    }


    template <typename T>
    Function1(T t)
        : m_invoker(new Function_object_invoker<R, Arg, T>(t))
    {
    }


    ~Function1()
    {
        delete m_invoker;
    }


    R  operator ()(Arg arg)
    {
        return (*m_invoker)(arg);
    }


private:
    Invoker_Base<R, Arg>*  m_invoker;
};


bool  Some_Function(const std::string& str)
{
    printf("%s ", str.c_str());
    printf("this is normal function.\n");
}


class  Some_Func_Class
{
public:
    bool  Some_Memfunc(const std::string& str)
    {
        printf("%s ", str.c_str());
        printf("this is member function.\n");
    }
};


class  Some_Object_Class
{
public:
    bool  operator()(const std::string& str) const
    {
        printf("%s ", str.c_str());
        printf("this is object function.\n");
    }
};


void  FuncTest()
{
    Function1<bool, const string&>  func1(Some_Function);
    func1("hello world");


    Some_Func_Class  sc;
    Function1<bool, const string&>  func2(&Some_Func_Class::Some_Memfunc, &sc);
    func2("hello world");


    Some_Object_Class  so;
    Function1<bool, const string&>  func3(so);
    func3("hello world");


    Function1<bool, const string&>  func4(std::bind(&Some_Func_Class::Some_Memfunc, &sc, _1));
    func4("hello world");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值