Мне нужна функция-обертка для std :: bind, которая будет вызываться перед функцией, которую она обернет, передавая аргументы обернутым функциям.
std::function<void (int)> foo = postbind<int>(service, handle);
Я дошел до этого
std::function<void (int)> foo = postbind(service, handle);
Как мне удалить этот параметр шаблона? Кажется, все сводится к выводу типа из функции генерации объекта (postbind), которая недостаточно умна.
#include <functional>
template<typename T>
void foo(std::function<void (T)> func)
{
}
void handler(int x)
{
}
int main()
{
foo(handler);
return 0;
}
Сообщает об ошибке: нет соответствующей функции для вызова 'foo (void (&) (int))'
Тем не менее, пример кода:
template<typename T>
void foo(T t)
{
}
int main()
{
foo(99);
return 0;
}
Это работает. Есть идеи, как сделать эту работу? Мне нужно иметь возможность передать ему std :: bind и успешно преобразовать результат в std :: function.
Как я могу удалить параметры шаблона? Спасибо.
Q. Что такое сервис и этот класс для этого?
а. Инкапсулируйте функцию-обертку, которая повышает :: asio :: io_service-> сообщения из текущего потока.
Полный исходный код:
#include <iostream>
#include <functional>
#include <memory>
class io_service
{
};
typedef std::shared_ptr<io_service> service_ptr;
template <typename Arg1>
class postbind_impl_1
{
public:
typedef std::function<void (Arg1)> function;
postbind_impl_1(service_ptr service, function memfunc)
: service_(service), memfunc_(memfunc)
{
}
void operator()(Arg1 arg1)
{
// do stuff using io_service
memfunc_(arg1);
}
private:
service_ptr service_;
function memfunc_;
};
template <typename Arg1>
postbind_impl_1<Arg1> postbind(service_ptr service,
typename postbind_impl_1<Arg1>::function handle)
{
return postbind_impl_1<Arg1>(service, handle);
}
// ----------------
void handle(int x)
{
std::cout << x << "\n";
}
int main()
{
service_ptr service;
std::function<void (int)> foo = postbind(service, handle);
foo(110);
return 0;
}