
David A. Greene schrieb:
On Thursday 11 March 2010 11:39:10 Steven Watanabe wrote:
Ugh. That makes things difficult then. There's no simple way to define a function that just takes a pair of iterators and does something with them. Surely others have tried to do things like this before. What's the typical solution?
Use a recursive function template or use one of fusion's algorithms.
But the non-compiling example in the first testcase shows that a fusion algorithm doesn't provide a general solution. The sequence could be the result of an application of transform() or some other algorithm that causes problems. Unless there's some other technique I've missed.
Change the signature of square's invocation operator to result_type operator()(int i) const and the sample should compile fine.
In any case, I wasn't completely clear about what my goal is. Ultimately I'd like to initialize a class with a pair of iterators:
[snip]
Unfortunately, it appears this isn't possible and foo will need at least two constructors:
struct foo { vector<int> data;
template<typename InputIterator> foo(InputIterator begin, InputIterator end) : data(begin, end) {}
template<typename Sequence> foo(Sequence d) { // Some fusion algorithm } };
That's correct.
But that doesn't seem to be a general solution either due to the transform() problem described above.
Joel referred to fusion::transform taking the sequence cref qualified only. This should not be a limitation for your particular use-case though. -Christopher