#include <queue>
#include <utility>
#include <future>
template <typename T>
class myqueue {
public:
myqueue() : q() {}
virtual ~myqueue() {}
// pushes a copy
virtual void push(const T& item) {
q.push(item);
}
// pushes the object itself (move)
virtual void push(T&& item) {
q.push(std::move(item));
}
private:
std::queue<T> q;
};
int main() {
// Thanks to Yakk for pointing out that I can reduce clutter by using one of std's non-copyable classes!
myqueue<std::packaged_task<int()>> q;
std::packaged_task<int()> t([]{return 42;});
q.push(std::move(t));
}
I2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGZ1dHVyZT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBteXF1ZXVlIHsKcHVibGljOgogICAgbXlxdWV1ZSgpIDogcSgpIHt9CiAgICB2aXJ0dWFsIH5teXF1ZXVlKCkge30KCiAgICAvLyBwdXNoZXMgYSBjb3B5CiAgICB2aXJ0dWFsIHZvaWQgcHVzaChjb25zdCBUJiBpdGVtKSB7CiAgICAgICAgcS5wdXNoKGl0ZW0pOwogICAgfQogICAgLy8gcHVzaGVzIHRoZSBvYmplY3QgaXRzZWxmIChtb3ZlKQogICAgdmlydHVhbCB2b2lkIHB1c2goVCYmIGl0ZW0pIHsKICAgICAgICBxLnB1c2goc3RkOjptb3ZlKGl0ZW0pKTsKICAgIH0KcHJpdmF0ZToKICAgIHN0ZDo6cXVldWU8VD4gcTsKfTsKCmludCBtYWluKCkgewogICAgLy8gVGhhbmtzIHRvIFlha2sgZm9yIHBvaW50aW5nIG91dCB0aGF0IEkgY2FuIHJlZHVjZSBjbHV0dGVyIGJ5IHVzaW5nIG9uZSBvZiBzdGQncyBub24tY29weWFibGUgY2xhc3NlcyEKICAgIG15cXVldWU8c3RkOjpwYWNrYWdlZF90YXNrPGludCgpPj4gcTsKICAgIHN0ZDo6cGFja2FnZWRfdGFzazxpbnQoKT4gdChbXXtyZXR1cm4gNDI7fSk7CiAgICBxLnB1c2goc3RkOjptb3ZlKHQpKTsKfQo=
In file included from /usr/include/c++/4.7/i486-linux-gnu/bits/c++allocator.h:34:0,
from /usr/include/c++/4.7/bits/allocator.h:48,
from /usr/include/c++/4.7/deque:62,
from /usr/include/c++/4.7/queue:61,
from prog.cpp:1:
/usr/include/c++/4.7/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = std::packaged_task<int()>; _Args = {const std::packaged_task<int()>&}; _Tp = std::packaged_task<int()>]’:
/usr/include/c++/4.7/bits/stl_deque.h:1376:6: required from ‘void std::deque<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::packaged_task<int()>; _Alloc = std::allocator<std::packaged_task<int()> >; std::deque<_Tp, _Alloc>::value_type = std::packaged_task<int()>]’
/usr/include/c++/4.7/bits/stl_queue.h:212:9: required from ‘void std::queue<_Tp, _Sequence>::push(const value_type&) [with _Tp = std::packaged_task<int()>; _Sequence = std::deque<std::packaged_task<int()>, std::allocator<std::packaged_task<int()> > >; std::queue<_Tp, _Sequence>::value_type = std::packaged_task<int()>]’
prog.cpp:13:9: required from ‘void myqueue<T>::push(const T&) [with T = std::packaged_task<int()>]’
prog.cpp:28:1: required from here
/usr/include/c++/4.7/ext/new_allocator.h:110:4: error: use of deleted function ‘std::packaged_task<_Res(_ArgTypes ...)>::packaged_task(const std::packaged_task<_Res(_ArgTypes ...)>&) [with _Res = int; _ArgTypes = {}; std::packaged_task<_Res(_ArgTypes ...)> = std::packaged_task<int()>]’
In file included from prog.cpp:3:0:
/usr/include/c++/4.7/future:1337:7: error: declared here