• 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

  • 相关阅读:
    gdb --configuration
    firecracker 编译
    gvisor 编译
    gvisor
    rust Deref
    rust explicit
    rust move
    rust drop
    出租人对经营租赁的会计处理
    关于以公允价值计量的投资性房地产的处置
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/1993062.html
Copyright © 2020-2023  润新知