Alcuni oggetti C++ non hanno un costruttore di copia, ma hanno un costruttore di mosse. Ad esempio, boost :: promise. Come posso legare quegli oggetti usando i loro costruttori di movimento?Come utilizzare boost :: bind con parametri non copiabili, ad esempio boost :: promise?
#include <boost/thread.hpp>
void fullfil_1(boost::promise<int>& prom, int x)
{
prom.set_value(x);
}
boost::function<void()> get_functor()
{
// boost::promise is not copyable, but movable
boost::promise<int> pi;
// compilation error
boost::function<void()> f_set_one = boost::bind(&fullfil_1, pi, 1);
// compilation error as well
boost::function<void()> f_set_one = boost::bind(&fullfil_1, std::move(pi), 1);
// PS. I know, it is possible to bind a pointer to the object instead of
// the object itself. But it is weird solution, in this case I will have
// to take cake about lifetime of the object instead of delegating that to
// boost::bind (by moving object into boost::function object)
//
// weird: pi will be destroyed on leaving the scope
boost::function<void()> f_set_one = boost::bind(&fullfil_1, boost::ref(pi), 1);
return f_set_one;
}
utilizzando un puntatore non è che strano, dipende da quello che si sta dando gli oggetti l'associazione. Ad esempio, se stai usando segnali, puoi salvare l'oggetto Connection e chiamare disconnect nel dtor dell'oggetto. Se non stai usando i segnali, potresti sviluppare qualcosa di simile, o avvolgere il puntatore in un parametro shared_ptr. – Kyle
boost :: promise, in realtà, è un shared_ptr e un bool. Sembra strano che dovrebbe essere allocato su heap e tracciabile con un altro shared_ptr. – user222202