Boost logo

Boost :

Subject: [boost] [Bind] Interoperability of bind/mem_fn with transform_iterator
From: Samuel Debionne (debionne_at_[hidden])
Date: 2010-04-30 03:37:05


Hello all,
I'm scratching my head about the correct way to use transform_iterator
with bind and mem_fn. In brief, bind and mem_fn return object functions
that are not Default Constructible, which means that, when used to
construct a transform_iterator, the resulting transform_iterator is not
even a Trivial Iterator.

Most of the case, it's not a problem because the transform_iterator is
never default constructed... until some libs that do concept checking on
their template parameters are used. See the following code for exemple :

#include <vector>
#include <boost/bind.hpp>
#include <boost/iterator/transform_iterator.hpp>
#include <boost/iterator/iterator_concepts.hpp>
#include <boost/concept/requires.hpp>

struct foo
{
   size_t id_;
   size_t get_id() const {return id_;}
};

template <class ForwardIterator>
void check(ForwardIterator _it)
{
   using namespace boost;

   function_requires<
     boost_concepts::ForwardTraversalConcept<ForwardIterator> >();
}

int main(int argc, char* argv[])
{
   using namespace boost;

   std::vector<foo> foo_vec;

   //Fail to compile since mem_fn is not Default Constructible
   check(make_transform_iterator(
     foo_vec.begin(), mem_fn(&foo::get_id)));

   //Fail to compile since mem_fn is not Default Constructible
   check(make_transform_iterator(
     foo_vec.begin(), mem_fn(&foo::id_)));

   return 0;
}

What would be the best way to handle the "problem" ? Patch the bind
library to add some default constructors ?

Best Regards,
Samuel


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk