Как приостановить присвоение переменной с помощью boost :: bind или boost :: lambda? - PullRequest
1 голос
/ 23 августа 2010

Я хочу приостановить функцию void (), которая устанавливает для переменной стека значение true.Как я могу это сделать?

bool flag = false;
boost::function<void()> f = ...;
f();
assert(flag);

Это, очевидно, игрушечный код, который демонстрирует проблему.Моя попытка сделать это, используя bind, была bind<void>(_1 = constant(true), flag);, но это приводит к ошибке компиляции.

1 Ответ

7 голосов
/ 24 августа 2010

Чтобы использовать boost::bind, вам нужно создать функцию, которая устанавливает логическое значение в true, чтобы вы могли связываться с ним:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/ref.hpp>

void make_true(bool& b)
{
    b = true;
}

int main()
{
    using namespace boost;

    bool flag = false;

    // without ref, calls with value of flag at the time of binding
    // (and therefore would call make_true with a copy of flag, not flag)
    function<void()> f = bind(make_true, ref(flag)); 

    f();
    assert(flag);
}

Однако лямбда тут поможет. Лямбды похожи на связывание, за исключением того, что они тоже создают функции, поэтому держите ваш код локализованным (не нужно никаких внешних функций). Вы бы сделали что-то вроде этого:

#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>

int main()
{
    using namespace boost;
    using namespace boost::lambda;

    bool flag = false;

    function<void()> f = (var(flag) = true);

    f();
    assert(flag);
}

Та же идея, за исключением того, что bind и make_true были заменены на лямбду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...