Schnittstelle für Iteration durch Member-Container
-
Ich stand zufaellig letztens vor EXAKT der selben Frage und habe mir die gleichen Gedanken gemacht. Ich hatte quick'n'dirty die von Dir beschriebene Version 5 gewaehlt. Bin jetzt auf Version 1 umgeschwenkt.
Am saubersten/besten/<setze passendes Adjektiv hier ein> (eben auch unter Deinen Gesichtspunkten) erscheint mir Version 4. Ich stellte nur fest, dass die sich nicht wirklich anwenden liess (in meinem Fall), weil nicht einfach nur eine Funktion auf jedes Element angewendet werden sollte, sondern auch noch ein State enthalten war. Schwups war man am Funktor schreiben und das ganze artete extrem aus, weil man dem Funktor eine ganze Menge Sachen (die eigentlich in der zugreifenden Klasse vorhanden waren) mitgeben musste. Das wiederrum ging nur sehr eingeschraenkt, weil die Sachen von aussen garnicht zugaenglich waren usw. usf.
Bin mir nicht sicher, was ich damit sagen will, vllt einfach: mach Dir nicht garsoviele Gedanken, wie Du diese eine Schnittstelle wirklich nur auf diesen einen Anwendungsfall beschraenkst; mit der naechsten Aenderung schmeisst du vllt wieder alles uebern Haufen :oDer (Design-) Perfektionist

-
Das hat was. In der Praxis wird sich nicht alles wie in der Theorie abspielen... Naja. Irgendwie muss ich mal was ausprobieren, nachher ist man immer schlauer. Aber wenigstens habe ich so mehrere Möglichkeiten ausprobiert.

Aber interessant, dass dich das auch erst gerade beschäftigt hat. Auf jeden Fall merci für den Hinweis!
-
Nochwas: wenns nur ums Lesen geht, dann kann man noch eine "Get" Funktion machen, die einen Output-Iterator als Parameter nimmt:
struct Element { int i; }; class MyClass { std::vector<Element> myvec; public: template <class OutputIterator> void GetElements(OutputIterator it) { BOOST_FOREACH(Element const& e, myvec) { *it = e; ++it; } } }; struct my_functor { void operator()(Element const& e) const { // do somethine with e } }; void test() { MyClass mc; // in vector kopieren std::vector<Element> eles; mc.GetElements(std::back_inserter(eles)); // direkt ausgeben mc.GetElements(std::ostream_iterator<Element>(std::cout,", ")); // in funktor umleiten mc.GetElements(boost::make_function_output_iterator(my_functor())); }Das wäre
* sicher (keiner kann was machen was du nicht willst)
* halbwegs bekannt/nicht unüblich
* sehr flexibel
* IMO halbwegs "schön" (ansichtssache, klar)
* "STL konform"
-
Sehr gut, noch ein Vorschlag, mit dem ich etwas herumtüfteln kann. Es gibt doch viel mehr Möglichkeiten als ich eigentlich angenommen habe, aber so wird mir wenigstens nicht langweilig. Danke!
