Christopher Smith on 14 Oct 2003 15:26:31 -0000 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [ALACPP] where the boost meets the stl |
On Tue, 2003-10-14 at 08:01, Jon Stewart wrote: > > > Yeah, I went to sleep thinking the only hook would be "operator int", > > > but I thought that couldn't possibly be what you meant. ;-) > > It's cool, though, because it comes with the realization that one can use > type conversion to let an object know when it's being used as an rvalue > and take appropriate action, thus enabling a form of lazy evaluation. My goodness! It's almost like you were doing our reading and paid attention to the section on auto_ptr! ;-) > > FYI, there is an even more evil way to do it that I also thought about: > > > > Create a wrapper iterator and dereferenced type that did all the > > evilness in operator()=(x). See, I can top your evil foo! > > so... like this? > > fill_n(MakeEvilIterator(back_inserter(vec)), 20, var(i)++); > > // EvilIterator overloads operator()=(x) to take the lambda function > // and assign the result of a call to the back_inserter. > > One issue, I'm not sure it's a problem, is that you sort of have the evil > iterator and the lambda function meeting in the middle, so to speak. For > lack of vocabulary, they "converge". Oh, I was thinking far worse than this. I was moving the lambda stuff into a type which wrapped the back_inserter and did operator()=(x) by doing i++. This is necessary because the evil iterator is going to be derefed before operator()=(x) is invoked. So, you have something like this, dropping the use of lambda for clarity (forgive any obvious syntactical errors.. it's early): template<typename I> class EvilIterator {}; template<typename I> class EvilType { public: EvilType(I anIter, int& aCounter) : iter(anIter), counter(aCounter) {} EvilType& operator=(int aNumber) { *iter = aNumber + (counter++); } protected: void advanceIter() { ++iter; } private: I iter; int& counter; friend class EvilIterator<I>; } template<typename I> class EvilIterator { public: explicit EvilIterator(const EvilType<I>& aCoConspirator) : coConspirator(aCoConspirator) {} EvilIterator<I>& operator++() { coConspirator.advanceIter(); return *this; } EvilType<I>& operator*() { return coConsiprator; } private: EvilType<I> coConspirator; }; fill_n(EvilIterator(EvilType(back_inserter(vec), i)), 20, 0); > (If Flannery O'Connor had been a l33t C++ h8x0r, she'd write code like > this.) That's reason enough not to do it. I may never forgive you for making me think about this stuff. -- Christopher Smith <x@xxxxxxxx> _______________________________________________ alacpp mailing list alacpp@xxxxxxxxxxx http://lists.ellipsis.cx/mailman/listinfo/alacpp