Opened 14 years ago
Closed 14 years ago
#2128 closed Feature Requests (fixed)
Add the ability to implicitly traverse reference wrappers
Reported by: | 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 , 14 years ago
Milestone: | Boost 1.36.0 → Boost 1.37.0 |
---|---|
Status: | new → assigned |
comment:2 by , 14 years ago
Milestone: | Boost 1.37.0 → Boost 1.39.0 |
---|
comment:3 by , 14 years ago
comment:4 by , 14 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Merged to release with [51534].
(In [51512]) Refs #2128 (fixed in trunk.)