1 // Copyright (C) 2013 Vicente Botet
2 //
3 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #define BOOST_THREAD_VERSION 4
7 
8 #include <iostream>
9 #include <functional>
10 //#include <future>
11 
12 #include <boost/thread.hpp>
13 #include <boost/shared_ptr.hpp>
14 
f()15 int f()
16 {
17   return 42;
18 }
19 
schedule(boost::function<int ()> const & fn)20 boost::packaged_task<int()>* schedule(boost::function<int ()> const& fn)
21 {
22   // Normally, the pointer to the packaged task is stored in a queue
23   // for execution on a separate thread, and the schedule function
24   // would return just a future<T>
25 
26   boost::function<int ()> copy(fn);
27   boost::packaged_task<int()>* result = new boost::packaged_task<int()>(copy);
28   return result;
29 }
30 
31 struct MyFunc
32 {
33   MyFunc(MyFunc const&) = delete;
34   MyFunc& operator=(MyFunc const&) = delete;
MyFuncMyFunc35   MyFunc() {};
MyFuncMyFunc36   MyFunc(MyFunc &&) {};
operator =MyFunc37   MyFunc& operator=(MyFunc &&) { return *this;};
operator ()MyFunc38   void operator()()const {}
39 };
40 
41 
main()42 int main()
43 {
44   boost::packaged_task<int()>* p(schedule(f));
45   (*p)();
46 
47   boost::future<int> fut = p->get_future();
48   std::cout << "The answer to the ultimate question: " << fut.get() << std::endl;
49 
50   {
51     boost::function<void()> f;
52     MyFunc mf;
53 
54     boost::packaged_task<void()> t1(f);
55     boost::packaged_task<void()> t2(boost::move(mf));
56   }
57 
58   return 0;
59 }
60 
61 
62