Здравствуйте, XuMuK, Вы писали:
XMK> отлично компилируется и работает как задумано: http://codepad.org/rka47j4d
Никто не сомневается, что bind компилируется и работает. Речь идет именно о
композиции функторов.
Комментарий
// What do we really need:
// runner.run(boost::bind(f, "arg1", "arg2"), true)
показывает порядок функторов, который хочется иметь. Возможно, я недостаточно точно описал суть проблемы.
Есть wrapper, который вызывает функтор с двумя параметрами. Есть 2 функтора:
f — содержит некоторый целевой функционал, т.е. непосредственно выполняет обработку;
run — выполняет промежуточные действия.
Если wrapper вызывает f:
boost::function<void (const std::string &, const std::string &)> f =\
boost::bind(&h::handle, boost::ref(handler)
, _1
, _2);
wrapper(f);
все здорово и тривиально (как в описанном Вами примере). Однако сложность заключается в том, чтобы "обернуть" функтор f в функтор run.
boost::function<void (const std::string &, const std::string &)> f =\
boost::bind(&h::handle, boost::ref(handler)
, _1
, _2);
boost::function<void (const std::string &, const std::string &)> run =\
boost::bind(&f_runner::run, boost::ref(runner)
, boost::protect(boost::bind(f
, _1
, _2)) // evaluation of _1 and _2 is needed
, true);
wrapper(run);