filter_iterator requires copy-constructible predicate?

Hi boost, The filter_iterator as implemented disallows creating iterators via reference-to-base, as it requires its Predicate objects to be copy-constructible. This is a problem for a class that is passed a ref to a predicate from elsewhere. It's a very easy fix, though, I'm wondering what the rationale originally was for the restriction. If it isn't significant, I'd propose the change below, as (at least from my narrow perspective) it is a big plus to be able to do this. 56c56 < filter_iterator(Predicate& f, Iterator x, Iterator end = Iterator()) ---
filter_iterator(Predicate f, Iterator x, Iterator end = Iterator())
82c82 < const Predicate& predicate() const { return m_predicate; } ---
Predicate predicate() const { return m_predicate; }
106c106 < Predicate& m_predicate; ---
Predicate m_predicate;
112c112 < make_filter_iterator(Predicate& f, Iterator x, Iterator end = Iterator()) ---
make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator())
Thanks for your time, -t

I hit send and thought maybe that wasn't completely clear, sorry about that. Here's a use-case: // // pure virtual base class // struct int_predicate { virtual ~int_predicate(){}; virtual bool operator()(int x) = 0; protected: int_predicate(){}; private: int_predicate(const int_predicate&); int_predicate& operator=(const int_predicate&); }; struct is_positive_number : public int_predicate { virtual bool operator()(int x) { return x > 0; } }; array<int, 10> a = { 0, -1, 2, -3, 4, -5, 6, -7, 8, -9 }; is_positive_number pos; int_predicate &ispos_ref = pos; for (filter_iterator<int_predicate,array<int,10>::iterator> iter = make_filter_iterator<int_predicate>(ispos_ref, a.begin(), a.end()); iter.base() != iter.end(); iter++) { // whatever } troy d. straszheim writes:
Hi boost,
The filter_iterator as implemented disallows creating iterators via reference-to-base, as it requires its Predicate objects to be copy-constructible. This is a problem for a class that is passed a ref to a predicate from elsewhere. It's a very easy fix, though, I'm wondering what the rationale originally was for the restriction. If it isn't significant, I'd propose the change below, as (at least from my narrow perspective) it is a big plus to be able to do this.
56c56 < filter_iterator(Predicate& f, Iterator x, Iterator end = Iterator()) ---
filter_iterator(Predicate f, Iterator x, Iterator end = Iterator())
82c82 < const Predicate& predicate() const { return m_predicate; } ---
Predicate predicate() const { return m_predicate; }
106c106 < Predicate& m_predicate; ---
Predicate m_predicate;
112c112 < make_filter_iterator(Predicate& f, Iterator x, Iterator end = Iterator()) ---
make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator())
Thanks for your time,
-t
-- troy d. straszheim ............................................................................ landline: (49) 30 9120 6877 [to direct dial from the us prepend 011] AIM: thetroyeffect IRC/efnet: phoniq skype.com: straszheim Why do so many CS majors confuse Halloween and Christmas? Because Oct 31 is Dec 25.

"troy d. straszheim" <troy@resophonic.com> wrote in message news:16813.55259.158027.969146@resophonic.com...
Hi boost,
The filter_iterator as implemented disallows creating iterators via reference-to-base, as it requires its Predicate objects to be copy-constructible. This is a problem for a class that is passed a
I haven't tried it but wouldn't boost::ref(predicate) accomplish your goal? Jeff
participants (2)
-
Jeff Flinn
-
troy d. straszheim