#include <functional> #include <iostream> #include <type_traits> template<typename Task> auto process(Task task) -> typename std::enable_if_t<std::is_integral_v<decltype(task())>, void> { std::cout << "Processing task with 'integral' return value\n"; //execute directly } template<typename Task ,typename = std::enable_if_t<std::is_void_v<decltype(std::declval<Task>()())>> > void process(Task task){ std::cout << "Processing task with 'void' return value\n"; (void) task; // not used // queue task } int main() { process([]() -> int { return 1; }); process([]() -> void {}); }