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;
    }

  • 相关阅读:
    java jni 调用c语言函数
    BeautifulSoup入门
    Python单引号、双引号、三个双引号的区别
    Request库的安装与使用
    awk命令入门
    sed命令入门
    编译生成protobuf的jar包
    编辑crontab添加Linux计划任务
    tar命令详解及使用实例
    MySQL用户管理
  • 原文地址:https://www.cnblogs.com/prajna/p/2934405.html
Copyright © 2011-2022 走看看