代码之家  ›  专栏  ›  技术社区  ›  shaz

C++调用每个调用回调函数的向量,并传递每个参数

  •  3
  • shaz  · 技术社区  · 14 年前

    我想把一堆回调存储在一个向量中,然后在合适的时候使用for theu调用它们。我希望回调函数能够接受参数。这是我的密码。问题出在void B::do\u another\u回调(std::string&)

    #include <boost/bind.hpp>
    #include <boost/function.hpp>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    
    
    
    class A {
    public:
        void print(std::string &s) {
            std::cout << s.c_str() << std::endl;
        }
    };
    
    typedef boost::function<void(std::string&)> another_callback;
    typedef boost::function<void()> callback;
    
    typedef std::vector<callback> callback_vector;
    typedef std::vector<another_callback> another_callback_vector;
    
    class B {
    public:
        void add_callback(callback cb) {
            m_cb.push_back(cb);
        }
    
        void add_another_callback(another_callback acb) {
            m_acb.push_back(acb);
        }
    
        void do_callbacks() {
            for_each(m_cb.begin(), m_cb.end(), this);
        }
    
        void do_another_callbacks(std::string &s) {
            std::tr1::function<void(another_callback , std::string &)> my_func = [] (another_callback acb, std::string &s) { acb(s); }
            for_each(m_acb.begin(), m_acb.end(), my_func(_1, s));
        }
    
        void operator() (callback cb) { cb(); }
    
    private:
        callback_vector m_cb;
        another_callback_vector m_acb;
    };
    
    void main() {
        A a;
        B b;
        std::string s("message");
        std::string q("question");
        b.add_callback(boost::bind(&A::print, &a, s));
        b.add_callback(boost::bind(&A::print, &a, q));
        b.add_another_callback(boost::bind(&A::print, &a, _1));
        b.do_callbacks();
        b.do_another_callbacks(s);
        b.do_another_callbacks(q);
    }
    

    我想我也许可以这样做。。。

    void do_another_callbacks(std::string &s) {
    
        for_each(m_acb.begin(), m_acb.end(), [&s](another_callback acb) {
            acb(s);
        });
    }
    

    但在MSVC2010中没有编译

    1 回复  |  直到 14 年前
        1
  •  5
  •   sudo make install Gazler    7 年前

    长例子的问题是 my_func(_1,s) std::bind (或 boost::bind

    您发布的替代代码确实有效,但由于中的代码,整个示例无法编译 do_callbacks :

    void do_callbacks() {
        for_each(m_cb.begin(), m_cb.end(), this);
    }
    

    this B* ,不可调用。如果你定义一个 result_type typedef以匹配 operator() std::ref(*this) 相反。以下代码在MSVC10下编译并运行:

    #include <functional>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    
    
    
    class A {
    public:
        void print(std::string &s) {
            std::cout << s.c_str() << std::endl;
        }
    };
    
    typedef std::function<void(std::string&)> another_callback;
    typedef std::function<void()> callback;
    
    typedef std::vector<callback> callback_vector;
    typedef std::vector<another_callback> another_callback_vector;
    
    class B {
    public:
        void add_callback(callback cb) {
            m_cb.push_back(cb);
        }
    
        void add_another_callback(another_callback acb) {
            m_acb.push_back(acb);
        }
    
        void do_callbacks() {
            std::for_each(m_cb.begin(), m_cb.end(), std::ref(*this));
        }
    
        void do_another_callbacks(std::string &s) {
    
            std::for_each(m_acb.begin(), m_acb.end(), [&s](another_callback acb) {
                    acb(s);
                });
        }
    
        typedef void result_type;
        void operator() (callback cb) { cb(); }
    
    private:
        callback_vector m_cb;
        another_callback_vector m_acb;
    };
    
    int main() {
        A a;
        B b;
        std::string s("message");
        std::string q("question");
        b.add_callback(std::bind(&A::print, &a, s));
        b.add_callback(std::bind(&A::print, &a, q));
        b.add_another_callback(std::bind(&A::print, &a, std::placeholders::_1));
        b.do_callbacks();
        b.do_another_callbacks(s);
        b.do_another_callbacks(q);
    }