#include <iostream>
#include <functional>
template <typename... Args>
std::function<void(Args...)> pushToEventLoop(std::function<void(Args...)> && p_function)
{
auto func = [p_function](Args... args) ->void
{
// This is what i would do here, but requires too much source code
//ThreadPool::enque(std::bind(p_function, args...));
// This is what i'll do for the sake of the example.
p_function(args...);
};
return func;
}
int main()
{
auto function(pushToEventLoop(std::function<void(char const *)>(std::bind(std::printf, std::placeholders::_1))));
auto function2 = std::bind(function, "Hello World!\n");
function2();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgpzdGQ6OmZ1bmN0aW9uPHZvaWQoQXJncy4uLik+IHB1c2hUb0V2ZW50TG9vcChzdGQ6OmZ1bmN0aW9uPHZvaWQoQXJncy4uLik+ICYmIHBfZnVuY3Rpb24pCnsKCWF1dG8gZnVuYyA9IFtwX2Z1bmN0aW9uXShBcmdzLi4uIGFyZ3MpIC0+dm9pZAoJewoJCS8vIFRoaXMgaXMgd2hhdCBpIHdvdWxkIGRvIGhlcmUsIGJ1dCByZXF1aXJlcyB0b28gbXVjaCBzb3VyY2UgY29kZQoJCS8vVGhyZWFkUG9vbDo6ZW5xdWUoc3RkOjpiaW5kKHBfZnVuY3Rpb24sIGFyZ3MuLi4pKTsKCQkvLyBUaGlzIGlzIHdoYXQgaSdsbCBkbyBmb3IgdGhlIHNha2Ugb2YgdGhlIGV4YW1wbGUuCgkJcF9mdW5jdGlvbihhcmdzLi4uKTsKCX07CglyZXR1cm4gZnVuYzsKfQoKaW50IG1haW4oKSAKewoJYXV0byBmdW5jdGlvbihwdXNoVG9FdmVudExvb3Aoc3RkOjpmdW5jdGlvbjx2b2lkKGNoYXIgY29uc3QgKik+KHN0ZDo6YmluZChzdGQ6OnByaW50Ziwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSkpKTsKCglhdXRvIGZ1bmN0aW9uMiA9IHN0ZDo6YmluZChmdW5jdGlvbiwgIkhlbGxvIFdvcmxkIVxuIik7CgoJZnVuY3Rpb24yKCk7CgoJcmV0dXJuIDA7Cn0=