Opened 14 years ago

Closed 14 years ago

#2128 closed Feature Requests (fixed)

Add the ability to implicitly traverse reference wrappers

Reported by: mgoldshteyn@… Owned by: Peter Dimov
Milestone: Boost 1.39.0 Component: bind
Version: Boost 1.35.0 Severity: Problem
Keywords: implicitly traverse reference_wrappers Cc:

Description

Please add the following to boost:

namespace boost {

template<class T> T* get_pointer( reference_wrapper<T> const & r ) {

return r.get_pointer();

}

}


Code demonstrating 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 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));

}


Peter Dimov's reply:

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();

}

}

Change History (4)

comment:1 by Peter Dimov, 14 years ago

Milestone: Boost 1.36.0Boost 1.37.0
Status: newassigned

comment:2 by Peter Dimov, 14 years ago

Milestone: Boost 1.37.0Boost 1.39.0

comment:3 by Peter Dimov, 14 years ago

(In [51512]) Refs #2128 (fixed in trunk.)

comment:4 by Peter Dimov, 14 years ago

Resolution: fixed
Status: assignedclosed

Merged to release with [51534].

Note: See TracTickets for help on using tickets.