Re: What's the advantage of using for_each loop?
On May 30, 5:02 pm, "Robbie Hatley" <bogus.addr...@no.spam> wrote:
The cool thing about for_each is:
1) you can pass the function objects by reference
I don't see how that could work. I thought the function
object is always passed by value?
I tried passing a function object to a for_each loop once,
where the function object was collecting data about
operations. But that didn't work, because for_each used a
*copy* of the object, rather than the object itself.
I was writing a spelling-checker, just for programming
practice. The for_each loop looked something like:
Append FuncObj = Append(Dictionary);
for_each(Dicts.begin(), Dicts.end(), FuncObj);
("Dicts" is a list of file paths, and "Dictionary" is a list
But the the counts of files and lines went into the unnamed
*copy* of FuncObj, not FuncObj itself.
The STL requires functional objects to have value semantics, so
you would (generally) write something like:
Append FuncObj( for_each( Dicts.begin(),
Append( Dictionary ) ) ) ;
The problem becomes more difficult if you are trying to use a
polymorphic object; you have to give it value semantics which do
not loose the polymorphic behavior, by means of the
letter/envelope idiom, or something similar. (Often, just a
small wrapper around a pointer will do the trick.)
2) you can apply side-effects on the function object
The function object can do just about anything which won't
invalidate the iterators. Including modifying program state.
3) you can use the return value of the for_each() algorithm
Hmmm.... Interesting. Perhaps, then, something like the following
would work in my spelling checker (could be used to count files --
or lines -- appended to a list of strings):
Append FuncObjCopy =
for_each(Dicts.begin(), Dicts.end(), Append(Dictionary););
cout << "Files processed = " << FuncObjCopy.files << endl;
cout << "Lines processed = " << FuncObjCopy.lines << endl;
Not quite as nice as getting for_each to use the original function
object, but almost.
In some contexts (including this one, IMHO), it's even nicer.
In others (i.e. polymorphic agents), it's a real pain you know
James Kanze (GABI Software) email:firstname.lastname@example.org
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34