User Tools

Site Tools


Fuct wrappers example

func2.cpp

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;
}

func4.cpp

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;
}
from promise: msg: hello1 + hello2
hello1hello2

First PagePrevious PageBack to overviewNext PageLast Page