// Copyright (C) 2013 Vicente Botet // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #define BOOST_THREAD_VERSION 4 #include #include #include #include #include int f() { return 42; } boost::packaged_task* schedule(boost::function const& fn) { // Normally, the pointer to the packaged task is stored in a queue // for execution on a separate thread, and the schedule function // would return just a future boost::function copy(fn); boost::packaged_task* result = new boost::packaged_task(copy); return result; } struct MyFunc { MyFunc(MyFunc const&) = delete; MyFunc& operator=(MyFunc const&) = delete; MyFunc() {}; MyFunc(MyFunc &&) {}; MyFunc& operator=(MyFunc &&) { return *this;}; void operator()()const {} }; int main() { boost::packaged_task* p(schedule(f)); (*p)(); boost::future fut = p->get_future(); std::cout << "The answer to the ultimate question: " << fut.get() << std::endl; { boost::function f; MyFunc mf; boost::packaged_task t1(f); boost::packaged_task t2(boost::move(mf)); } // { // MyFunc mf; // //std::packaged_task t1(mf); // //std::function f1(std::move(mf)); // std::function f1; // f1 = std::move(mf); // // //std::function f2((std::packaged_task(mf))); // } // { // MyFunc mf; // std::packaged_task t1(mf); // // std::function f2(std::move(t1)); // } // { // MyFunc mf; // boost::packaged_task t1(mf); // // std::function f2(boost::move(t1)); // } return 0; }