Jon Stewart on 14 Oct 2003 14:18:23 -0000 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [ALACPP] where the boost meets the stl |
> On Mon, 2003-10-13 at 23:27, Jon Stewart wrote: > > Namely, it fills the vector with the numbers 1..20. > > > > My question is, how can you do the same thing with std::fill_n, given its > > prototype: > > > > template<class OutIt, class Size, class T> > > void fill_n(OutIt first, Size n, const T& x); > > Umm... you don't. I think I don't understand the question. generate & > fill are meant to do different things. The way fill works, > operator()=(x) is going to be invoked from first to (first + n). Not > much wiggle room there for built in types. <giddy> You can! Ha-ha! It compiled!! :-) </giddy> It's pure, pure chicanery... #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <boost/lambda/lambda.hpp> #include <boost/smart_ptr.hpp> using namespace boost::lambda; using namespace std; template<class FnT> class Converter { public: Converter(FnT& f) : Fn(f) {} operator int() const { // ideally, you deduce this from FnT return fn(); // the const is really important } private: FnT& Fn; }; template<class FnT> boost::shared_ptr< Converter<FnT> > MakeConverter(FnT& f) { boost::shared_ptr< Converter<FnT> > ptr(new Converter<FnT>(f)); return ptr; } int main(int argc, char *argv[]) { vector<int> vec; int i = 0; fill_n(back_inserter(vec), 20, *MakeConverter(var(i)++)); for_each(vec.begin(), vec.end(), cout << _1 << '\n'); return EXIT_SUCCESS; } Jon -- Jon Stewart Advanced Los Angeles C++ stew1@xxxxxxxxxxx http://www.alacpp.org _______________________________________________ alacpp mailing list alacpp@xxxxxxxxxxx http://lists.ellipsis.cx/mailman/listinfo/alacpp