User Tools

Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cpp:func2 [2019-05-28 15:26]
cpp:func2 [2020-02-15 00:57] (current)
Line 1: Line 1:
 +=====Fuct wrappers example=====
 +
 +====func2.cpp====
 +
 +<code c++ func2.cpp>​
 +/*
 + *
 + * Copyright 2004-2019 Oleg Borodin ​ <​borodin@unix7.org>​
 + *
 + * 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;
 +}
 +</​code>​
 +
 +====func4.cpp====
 +<code c++ func4.cpp>​
 +/*
 + * Copyright 2004-2019 Oleg Borodin ​ <​borodin@unix7.org>​
 + */
 +
 +#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;
 +}
 +</​code>​
 +
 +<​file>​
 +from promise: msg: hello1 + hello2
 +hello1hello2
 +</​file>​
 +
 +----
 +[<>]