2010-05-14 15 views
10

Bazı C++ nesnelerinin kopya kurucusu yok, ancak taşınıyor. Örneğin, boost :: promise. Bu nesneleri, hareket ettiricileri kullanarak nasıl bağlarım?Nasıl kullanılır? Boost :: non-koptable params ile bağlama, örneğin 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; 
} 
+0

aşağıdaki gibi hareket edebilir. Örneğin, sinyal kullanıyorsanız Bağlantı nesnesini kaydedebilir ve nesnenin dtor'undaki bağlantıyı kesebilirsiniz. Sinyal kullanmıyorsanız, benzer bir şey geliştirebilir veya işaretçiyi bir shared_ptr'ye sarabilirsiniz. – Kyle

+0

boost :: söz, aslında, bir shared_ptr ve bir bool. Yığın üzerine ayrılması ve bir tane daha shared_ptr ile takip edilmesi garip görünüyor. – user222202

cevap

4

yerine bir hareket yapıcı nasıl kullanılacağı emin değilim, ama başka bir yaklaşım nesnelere copyable başvuru oluşturur boost :: ref kullanmaktır ve daha sonra boost :: bağlama içine olanlar geçebilir.

+0

Boost :: ref, yalnızca başvurulan nesne geçerli olduğu sürece çalışıyor mu? –

+0

Evet, birlikte çalıştığınız nesnelerin ömrü hakkında endişelenmeniz gerekiyor. – swestrup

5

Std :: move kullandığınızı görüyorum. Neden std :: bind'i kullanmıyorsunuz, hangi anlambilimsel hareketin farkında olmalı?

template<class F, class... BoundArgs> 
unspecified bind(F&&, BoundArgs&&...); 
template<class R, class F, class... BoundArgs> 
unspecified bind(F&&, BoundArgs&&...); 

Blk fullfil_1

void fullfil_1(boost::promise<int>&é prom, int x) 
{ 
    prom.set_value(x); 
} 

Boost.Bind bir hamle sürümünü ilan etme konusundaki does not destekler (en azından ben farkında değilim) henüz anlambilim taşıyın. Umuyorum ki şu anda gözden geçirilmiş Boost.Move kabul edilecektir ve Boost.Bind, Boost.Lambda ve Boost.Phoenix hareket semantics arayüzleri ekleyecektir.

Bunu sen bağlamak nesneleri için bunu veriyoruz bağlıdır, ref beste denemek ve bir işaretçi o garip değil kullanma

boost::function<void()> f_set_one = boost::bind(&fullfil_1, boost::ref(std::move(pi)), 1);