2013-07-01 27 views
6

Ben g ++ - 4.7 (+ Ubuntu/Linaro 4.7.3-2ubuntu ~ 12.04, spesifik olmak için) C++ 11 için destek araştırıyorum ve farklılıklar bulmak gibi görünüyor. Özelliklestd :: bind ve boost :: bind arasında önemli farklar görüyor muyum?

, I #include <boost/bind.hpp> açıklama ve sistematik (http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp alınan) Kuvvetlendirme ASIO uyumsuz istemci örnekte std::bind ile boost::bind tekrarlarını yerine, program artık derler.

Bunun için herhangi bir açıklama var mı?

+2

ait boost::asio::stdplaceholders::* kullanabilir? – Praetorian

+0

İç içe geçmiş bağlarla farklı davranışlar gördüğümü hatırlıyorum. Şu anki özellikleri hatırlamıyorum. Ancak, bu burada ne koşuyorsun _not_. – sehe

cevap

7
#include <functional> 
namespace boost { 
    namespace asio { 
     namespace stdplaceholders { 
      static decltype (:: std :: placeholders :: _1) & error = :: std :: placeholders :: _1; 
      static decltype (:: std :: placeholders :: _2) & bytes_transferred = :: std :: placeholders :: _2; 
      static decltype (:: std :: placeholders :: _2) & iterator = :: std :: placeholders :: _2; 
      static decltype (:: std :: placeholders :: _2) & signal_number = :: std :: placeholders :: _2; 
     } 
    } 
} 

ve başarısız bir yedek (tercihen tek yedek) yapmak ve derleyici hatası ile birlikte modifiye kod sonrası misiniz yerine boost::asio::placeholders::*

+0

Bir çekicilik gibi çalıştı, çok teşekkürler! –

4

boost::asio::placeholders, std::bind ile birlikte kullanılamaz. bağlantı verdiğiniz örnekte, boost::bind için ilk çağrı aşağıdaki kodda oluşur: std::bind ile

resolver_.async_resolve(query, 
    boost::bind(&client::handle_resolve, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::iterator)); 

Basitçe boost::bind değiştirilmesi

hataların bir demet yol açar. Derlenmesini sağlamak için std::placeholders ile boost::asio::placeholders'u değiştirmeniz gerekir.

resolver_.async_resolve(query, 
    std::bind(&client::handle_resolve, this, 
     std::placeholders::_1, 
     std::placeholders::_2)); 

Bu değişiklikleri yaptıktan sonra kodun işlevsel olarak aynı olduğunu doğrulamadığımı unutmayın, yalnızca derler.