Отличная статья! Подобраны, довольно часто встречающиеся, и жизненые примеры «плохого кода». Сам давно стараюсь пользоваться принципами «программирования от абстракции», а не «от реализации».
Довольно интерессное предложение. Но насколько я понял, избежать работы с variadic templates не получится. Возможно я что-то не так понял, но вот по быстрому набросал реализацию:
std::queue<std::packaged_task<void()>> queue;
template<class FUNCTION, class ...ARGS>
std::future<typename std::result_of<FUNCTION(ARGS...)>::type>
dispatch(FUNCTION &&f, ARGS &&...args) {
std::packaged_task<typename std::result_of<FUNCTION(ARGS...)>::type()> task(std::bind(f,args...));
auto future = task.get_future();
queue.push(std::packaged_task<void()>(std::move(task)));
return future;
}
std::function<void(int, float, std::string)> function = [](int a, float b, const std::string& c)
{
EXPECT_TRUE(a == 1 && b == 2.0f && c == "Hello World");
};
auto future = dispatch(std::move(function), 1, 2.0f, "Hello World");
queue.back()();
Поправьте меня, если я не прав :-)
Но все равно спасибо за замечание, так как без вас вряд бы проверил такой вариант. ;-)