
The following snippet is the mock-up of the problem I am having in order to be able to reproduce. -------------------------------------------------------------------------------- #include <iostream> #include <boost/range.hpp> #include <boost/range/adaptors.hpp> #include <boost/range/algorithm.hpp> #include <boost/bind.hpp> #include <boost/assign.hpp> using namespace boost::assign; struct wxSize { wxSize(int height=0,int width=0):m_height(height),m_width(width) { } int GetWidth() const {return m_width;} int m_height; int m_width; }; class wxWindowBase { public: wxSize GetTextExtent(const std::string val) { return wxSize(0,val.length()); } void DoLayout(std::vector<std::string> m_FilteredItems) { using boost::adaptors::transformed; wxSize longest = *boost::max_element(m_FilteredItems | transformed(boost::bind(&wxWindowBase::GetTextExtent,this,_1)), boost::bind(std::less<int>(),boost::bind(&wxSize::GetWidth,_1),boost::bind(&wxSize::GetWidth,_2))); std::cout <<longest.GetWidth(); } }; int main() { std::vector<std::string> input; input += "o","two","threexxx","four"; wxWindowBase window; window.DoLayout(input); } ----------------------------------------------------------------------------------------- The above code fails to compile on GCC4.7.2 and MSVC10 although it compiles and runs fine on clang3.3
From what I understand ,transformed returns a Single Pass Range and max_element expects a ForwardRange and that's the gist of the problem.But it works for something like
max_element(someint_vector | transformed(doubleit()),std::less<int>()); without problems. Is there a elegant way to achieve what I am trying to without using a intermediate container? Thanks in advance..