#pragma once #include #include namespace exe::executors { namespace detail { template struct TaskBaseFunction : TaskBase { explicit TaskBaseFunction(T&& task) : task_(std::move(task)) { } void Run() noexcept override { try { task_(); } catch (...) { } Discard(); } void Discard() noexcept override { delete this; } private: T task_; }; } // namespace detail /* * Usage: * Execute(thread_pool, []() { * std::cout << "Hi" << std::endl; * }); */ template void Execute(IExecutor& where, F&& f, Hint hint = Hint::UpToYou) { where.Execute(new detail::TaskBaseFunction(std::move(f)), hint); } } // namespace exe::executors