C ++ for_each, вызывающий вектор функций обратного вызова и передающий каждому из них аргумент - PullRequest
3 голосов
/ 15 июля 2010

Я довольно зеленый, когда дело доходит до c ++ 0x, лямбды и тому подобного, так что я надеюсь, что вы, ребята, можете помочь мне с этой маленькой проблемой.вектор, а затем используйте for_each для вызова их, когда настало время.Я хочу, чтобы функции обратного вызова могли принимать аргументы.Вот мой код прямо сейчас.Проблема в пустотене компилируется в MSVC2010

1 Ответ

5 голосов
/ 16 июля 2010

Проблема с длинным примером состоит в том, что 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...