|
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