Предположим, у меня есть функция с именем subscribe()
, которая принимает обработчик обратного вызова, который будет вызываться при срабатывании события.Отправлять обратные вызовы в очередь задач с помощью boost :: bind
Теперь у меня есть другая версия, называемая subscribe2()
. Все одно и то же, за исключением того, что при запуске ему необходимо отправить его в очередь событий. Он реализован с использованием оригинала subscribe()
, с вспомогательным функционалом, который называется helper()
. Все, что он делает, это привязать исходный обработчик и любые дополнительные аргументы к функтору и вызвать postToEventQueue()
.
Теперь мне интересно, если есть способ устранить вспомогательную функцию, так что в subsribe2()
, я могу как-то упаковать postToTaskQueue()
функции и оригинальный обработчик обратного вызова напрямую, и передать его в subscribe()
. Причина в том, что у меня много разных типов обработчиков, и утомительно и утомительно вводить вспомогательную функцию по всему месту. Afterall, boost :: bind должен возвращать новую функцию, учитывая исходную функцию, правильно? Я пытаюсь сгенерировать вспомогательную функцию непосредственно с boost :: bind.
Одна попытка сказать
subscribe(boost::bind(boost::bind(postToTaskQueue, boost::bind(_1, _2)), cb, _1));
в subscribe2()
, но он не работает. Это вообще возможно?
См. Подробный пример кода ниже. Благодаря!
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>
typedef boost::function<void(int)> SomeCallback;
typedef boost::function<void()> Task;
void handler(int i){
std::cout << "i=" << i <<std::endl;
}
void subscribe(SomeCallback cb)
{
cb(100); //just invoke the callback for simplicity
}
void postToTaskQueue(Task t)
{
t(); // just invoke the task for simplicity
}
void helper(SomeCallback cb, int i)
{
Task t = boost::bind(cb, i);
postToTaskQueue(t);
}
void subscribe2(SomeCallback cb)
{
subscribe(boost::bind(helper, cb, _1));
// this does not work..
// subscribe(boost::bind(boost::bind(postToTaskQueue, boost::bind(_1, _2)), cb, _1));
}
int main()
{
subscribe(boost::bind(handler, _1));
subscribe2(boost::bind(handler, _1));
}
Как я пропустил этот ответ. Мне нравится ваше объяснение (как это часто бывает), и хотя он по-прежнему требует «помощников», по крайней мере, он использует только общие, многоразовые. – sehe