/* * * Author, Copyright: Oleg Borodin <onborodin@gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * */ #include <iostream> #include <functional> #include <string> #if 0 template<typename F, typename... ARGS> typename std::result_of<F(ARGS...)>::type runner(F&& f, ARGS&&... args) { return f(args...); } #endif template<typename F, typename... ARGS> auto runner(F&& f, ARGS&&... args) -> decltype(f(args...)) { return f(args...); } int main(int argc, char **argv) { auto hello = [](std::string msg) -> std::string { return msg; }; std::cout << runner(hello, "hello") << std::endl; return 0; }
/* * Author, Copyright: Oleg Borodin <onborodin@gmail.com> */ #include <iostream> #include <functional> #include <string> #include <future> #include <thread> template <typename F, typename... ARG> std::future<typename std::result_of<F(ARG...)>::type> spawn(F&& f, ARG&&... arg) { typedef typename std::result_of<F(ARG...)>::type result_type; // std::packaged_task<result_type(ARG...)> task(std::move(f)); auto task = std::packaged_task<result_type(ARG...)>(std::move(f)); // std::future<result_type> res(task.get_future()); // std::future<result_type> res = task.get_future(); auto res = task.get_future(); std::thread t(std::move(task), std::move(arg)...); t.detach(); return res; } int main(int argc, char **argv) { auto hello = [](std::string msg1, std::string msg2) -> std::string { std::cout << "msg: " << msg1 << " + " << msg2 << std::endl; return msg1 + msg2; }; std::cout << "from promise: " << spawn(hello, std::string("hello1"), std::string("hello2")).get() << std::endl; return 0; }
from promise: msg: hello1 + hello2 hello1hello2
[<>]