Bind question, is there any way to implicitly go through a reference_wrapper?

Here is a contrived example that illustrates the issue: #include <boost/bind.hpp> #include <boost/ref.hpp> #include <string> // Define a simple class for our example class Crayon { public: explicit Crayon(const std::string &color=std::string()):m_color(color) {} const std::string &GetColor() const {return m_color;} private: std::string m_color; }; int main(int argc, char *argv[]) { using namespace std; using namespace boost; Crayon cr("blue"); boost::reference_wrapper<const Crayon> crefCr(cr); // This compiles std::string color(boost::bind(&Crayon::GetColor,_1)(cr)); // This also compiles, using an explicit get on crefCr std::string colorFromConstRef(boost::bind(&Crayon::GetColor,boost::bind(&boost::referenc e_wrapper<const Crayon>::get,_1))(crefCr)); // This doesn't compile, however, even though the reference_wrapper class template has // an overloaded operator T& () const function std::string colorFromConstRef2(boost::bind(&Crayon::GetColor,_1)(crefCr)); }

Michael Goldshteyn:
// This doesn't compile, however, even though the reference_wrapper class template has // an overloaded operator T& () const function
std::string colorFromConstRef2(boost::bind(&Crayon::GetColor,_1)(crefCr));
It doesn't because of the mem_fn behavior that bind inherits. The argument is not a reference to Crayon and so is assumed to be a smart pointer to Crayon. mem_fn then tries to invoke get_pointer() on it to obtain a Crayon*. You should be able to make it compile by adding a get_pointer overload for reference_wrapper: namespace boost { template<class T> T* get_pointer( reference_wrapper<T> const & r ) { return r.get_pointer(); } }
participants (2)
-
Michael Goldshteyn
-
Peter Dimov