zoukankan      html  css  js  c++  java
  • C++ callback 规格严格

    回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般情况下, 我们使用的回调函数基本都是采用C语言风格. 这里介绍一种C++风格的回调对象方法. 采用template实现.

    view plaincopy to clipboardprint?
    template < class Class, typename ReturnType, typename Parameter >  
    class SingularCallBack  
    {  
     
       public:  
     
        typedef ReturnType (Class::*Method)(Parameter);  
     
        SingularCallBack(Class* _class_instance, Method _method)  
        {  
           //取得对象实例地址,及调用方法地址  
           class_instance = _class_instance;  
           method        = _method;  
        };  
     
        ReturnType operator()(Parameter parameter)  
        {  
           // 调用对象方法  
           return (class_instance->*method)(parameter);  
        };  
     
        ReturnType execute(Parameter parameter)  
        {  
           // 调用对象方法  
           return operator()(parameter);  
        };  
     
     
       private:  
     
        Class*  class_instance;  
        Method  method;  
     
    }; 
    template < class Class, typename ReturnType, typename Parameter >
    class SingularCallBack
    {

       public:

        typedef ReturnType (Class::*Method)(Parameter);

        SingularCallBack(Class* _class_instance, Method _method)
        {
           //取得对象实例地址,及调用方法地址
           class_instance = _class_instance;
           method        = _method;
        };

        ReturnType operator()(Parameter parameter)
        {
           // 调用对象方法
           return (class_instance->*method)(parameter);
        };

        ReturnType execute(Parameter parameter)
        {
           // 调用对象方法
           return operator()(parameter);
        };


       private:

        Class*  class_instance;
        Method  method;

    };
     

    示例:

    以下是两个类实现.

    view plaincopy to clipboardprint?
    class A  
    {  
     
       public:  
     
        void output()  
        {  
           std::cout << "I am class A :D" << std::endl;  
        };  
     
    };  
     
    class B  
    {  
     
       public:  
     
        bool methodB(A a)  
        {  
           a.output();  
           return true;  
        }  
     
    }; 
    class A
    {

       public:

        void output()
        {
           std::cout << "I am class A :D" << std::endl;
        };

    };

    class B
    {

       public:

        bool methodB(A a)
        {
           a.output();
           return true;
        }

    };

    SingularCallBack的各种调用示例:

    view plaincopy to clipboardprint?
    A a;  
    B b;  
     
    SingularCallBack< B,bool,A >* cb;  
    cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);  
     
    if((*cb)(a))  
    {  
       std::cout << "CallBack Fired Successfully!" << std::endl;  
    }  
    else 
    {  
       std::cout << "CallBack Fired Unsuccessfully!" << std::endl;  

    A a;
    B b;

    SingularCallBack< B,bool,A >* cb;
    cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);

    if((*cb)(a))
    {
       std::cout << "CallBack Fired Successfully!" << std::endl;
    }
    else
    {
       std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
    }
     

    view plaincopy to clipboardprint?
    A a;  
    B b;  
     
    SingularCallBack< B,bool,A >* cb;  
    cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);  
     
    if(cb->execute(a))  
    {  
       std::cout << "CallBack Fired Successfully!" << std::endl;  
    }  
    else 
    {  
       std::cout << "CallBack Fired Unsuccessfully!" << std::endl;  

    A a;
    B b;

    SingularCallBack< B,bool,A >* cb;
    cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);

    if(cb->execute(a))
    {
       std::cout << "CallBack Fired Successfully!" << std::endl;
    }
    else
    {
       std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
    }
     

    view plaincopy to clipboardprint?
    A a;  
    B b;  
    SingularCallBack< B,bool,A >cb(&b,&B::methodB);  
     
    if(cb(a))  
    {  
       std::cout << "CallBack Fired Successfully!" << std::endl;  
    }  
    else 
    {  
       std::cout << "CallBack Fired Unsuccessfully!" << std::endl;  

    A a;
    B b;
    SingularCallBack< B,bool,A >cb(&b,&B::methodB);

    if(cb(a))
    {
       std::cout << "CallBack Fired Successfully!" << std::endl;
    }
    else
    {
       std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
    }
     

    view plaincopy to clipboardprint?
    class AClass  
    {  
       public:  
     
         AClass(unsigned int _id): id(_id){};  
        ~AClass(){};  
     
         bool AMethod(std::string str)  
         {  
            std::cout << "AClass[" << id << "]: " << str << std::endl;  
            return true;  
         };  
     
       private:  
     
        unsigned int id;  
     
    };  
     
     
    typedef SingularCallBack < AClass, bool, std::string > ACallBack;  
     
     
    int main()  
    {  
     
       std::vector < ACallBack > callback_list;  
     
       AClass a1(1);  
       AClass a2(2);  
       AClass a3(3);  
     
       callback_list.push_back(ACallBack(&a1, &AClass::AMethod));  
       callback_list.push_back(ACallBack(&a2, &AClass::AMethod));  
       callback_list.push_back(ACallBack(&a3, &AClass::AMethod));  
     
       for (unsigned int i = 0; i < callback_list.size(); i++)  
       {  
          callback_list[i]("abc");  
       }  
     
       for (unsigned int i = 0; i < callback_list.size(); i++)  
       {  
          callback_list[i].execute("abc");  
       }  
     
       return true;  
     

    class AClass
    {
       public:

         AClass(unsigned int _id): id(_id){};
        ~AClass(){};

         bool AMethod(std::string str)
         {
            std::cout << "AClass[" << id << "]: " << str << std::endl;
            return true;
         };

       private:

        unsigned int id;

    };


    typedef SingularCallBack < AClass, bool, std::string > ACallBack;


    int main()
    {

       std::vector < ACallBack > callback_list;

       AClass a1(1);
       AClass a2(2);
       AClass a3(3);

       callback_list.push_back(ACallBack(&a1, &AClass::AMethod));
       callback_list.push_back(ACallBack(&a2, &AClass::AMethod));
       callback_list.push_back(ACallBack(&a3, &AClass::AMethod));

       for (unsigned int i = 0; i < callback_list.size(); i++)
       {
          callback_list[i]("abc");
       }

       for (unsigned int i = 0; i < callback_list.size(); i++)
       {
          callback_list[i].execute("abc");
       }

       return true;

    }
     

    引用:

    C++ Callback Solution (http://www.partow.net/programming/templatecallback/index.html)

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/force_eagle/archive/2009/07/14/4347329.aspx

  • 相关阅读:
    springboot maven打包插件
    maven打包指定main入口插件
    团队开发环境一致性性要求
    springboot 在idea中实现热部署
    IDEA 2018.1可用License服务(持续更新)
    IDEA打jar包
    3月18号
    3月17号
    3月16号
    3月13号
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/1993062.html
Copyright © 2011-2022 走看看