zoukankan      html  css  js  c++  java
  • 成员函数對象

    template <typename ReturnType, typename ArgType>
    struct closure_entity_base
    {
        virtual ReturnType operator()(ArgType a)=0;
        virtual closure_entity_base* clone()const=0;
    };
    
    template <class ClassType, typename ReturnType, typename ArgType>
    struct closure_entity : closure_entity_base<ReturnType, ArgType>
    {
        ReturnType operator()(ArgType a)
        {
            return (m_object.*m_fp)(a);
        }
        closure_entity(ClassType& object, ReturnType (ClassType::*fp)(ArgType))
            :m_object(object), m_fp(fp)
        {}
        virtual closure_entity_base<ReturnType, ArgType>* clone()const
        {
            return new closure_entity(*this);
        }
        ClassType& m_object;
        ReturnType (ClassType::*m_fp)(ArgType);
    };
    
    template <typename ReturnType, typename ArgType>
    struct closure
    {
        template <class ClassType>
        closure(ClassType& object, ReturnType(ClassType::*fp)(ArgType))
            :entity(new closure_entity<ClassType, ReturnType, ArgType>(object, fp))
        {}
    
        ~closure(){delete entity;}
    
        closure(const closure& src)
        {
            entity = src.entity->clone();
        }
    
        closure& operator=(const closure& src)
        {
            if(&src!=this)
            {
                delete entity;
                entity = src.entity->clone();
            }
            return *this;
        }
    
        ReturnType operator()(ArgType a)
        {
            return (*entity)(a);
        }
    
        closure_entity_base<ReturnType, ArgType>* entity;
    };
    
    class Test
    {
    public:
        int foo(int x){return x*x;}
    };
    
    #include <iostream>
    
    int main( void )
    {
        Test t;
        closure<int, int> c(t, &Test::foo);
        std::cout << c(10) << '\n';
        return 0;
    }

  • 相关阅读:
    MyEclipse错误积累--持续更新
    Git错误积累-持续更新
    MySQL错误积累-持续更新
    评价一个人,就是要看他把时间都花在哪了
    收集的yum命令博文
    Github 常用命令
    python库收藏
    [转载]Scikit Learn: 在python中机器学习
    Windows下python安装Matplotlib、Numpy和Scipy模块
    [LeetCode] #45 Jump Game II
  • 原文地址:https://www.cnblogs.com/prajna/p/2934405.html
Copyright © 2011-2022 走看看