stl: generate in Memberfunktion aufrufen
-
Folgende Beispielklasse:
class Print { private: int number; int generator(); public: void operator() (int count) { std::ostream_iterator<int> os(std::cout); std::generate_n(os, count, generator); //<- FEHLER } }; int Print::generator() {return number++;}
Das Problem ist, dass generator() eine nicht-static Memberfunktion der Klasse ist.
Fehler: error: must use .* or ->* to call pointer-to-member function in `__gen (...)'
Habe mir schon "Member Functions Adapters" usw. angeschaut, aber das ist nicht was ich brauche oder ich habe irgend was falsch gemacht.
Vielleicht hat jemand ne Lösung oder Idee,
Danke
-
entweder static, oder mit mem_fun aus der stl(bzw aus boost die functoren), mehr gibts nicht.
-
Mit mem_fun habe ichs bereits versucht. Soweit mir bekannt, benötigt aber mem_fun irgendwas in der Art "&Klasse::Funktion". Da aber in diesem Fall die Klasse ( Print ) beim aufruf von "generate" noch nicht bekannt ist, habe ich dort ein Problem.
-
dann pack da noch ein bind1st drumrum.
-
Hey sorry, bin vielleicht heute etwas schwer von Begriff, aber kannst du mal ein Beispiel machen?
-
class Print { private: int number; int generator(); public: void operator() (int count) { std::ostream_iterator<int> os(std::cout); std::generate_n(os, count, std::bind1st(std::mem_fun(&Print::generator),this)); //<-sollte funzen } }; int Print::generator() {return number++;}
-
Hi!
Der dritte Parameter von generate_n ist der Aufruf eines Konstruktors. Die Klasse von welcher der Konstruktor aufgerufen wird muss den Opterator 'operator()' überladen, welcher einen Wert zurückliefern muss. (Ich gebe keine Garantie auf Richtigkeit, das ist meine Interpretation aus dem Stroustrup, ich lasse mich gerne korrigiren!). Folgender Code funktioniert bei mir allerdings:
#include <iostream> #include <iterator> #include <algorithm> class generator { private: int number; public: generator() { number = 0; } ~generator() {} int operator()(){ return number++; } }; class Print { public: Print (int count) { std::ostream_iterator<int> os(std::cout); std::generate_n(os, count, generator()); } }; int main() { Print x(5); }
Code-Hacker
-
stimmt, das funktor prinzip
wobvei der letzte parameter kein ctor sein muss, sondern auch jede beliebige variable sein kann(hauptsache sie unterstützt op() )
-
Okey, sa marche!
Danke für die Lösung. Habe gar nicht daran gedacht ne Klasse zu machen. Wäre halt schon schöner wenn es per Funktion realisierbar wäre. Aber vielleicht findet jemand noch ne andere Lösung.
Ich geh dann mal
Einen schönen Abend noch.