Wie kann man Code Kopie durch Template ersetzen?
-
Vielleicht wäre was möglich, aber solange der Kontext ein großes Geheimnis ist, natürlich nicht. Das geht dann für 100€/h.
-
volkard schrieb:
Übungsaufgabe vom Prof? Dann fehlt mehr Kontext, um zu ahnen, auf was er hinauswill.
Wenns von einem Prof käme könnte der vielleicht einen vptr-Hack erwarten. Standardkonform geht das jedenfalls nur mit den 2^17 ifs (weil unsigned nur von 0 bis 2^16 gehen muss).
@tjroamer: Wenn du wenigstens die Signatur in
std::vector<std::shared_ptr<thing_dispatcher*>>ändern könntest, hättest du noch eine kleine Chance (sofern du die Erstellung der Liste beeinflussen kannst).Es sieht so aus, dass ich 2^32 Mal schreiben muss, um alle möglichen Fälle abzudecken.
Ach nein, da ist ein Troll am Werk. Hat sich erledigt.
-
Sone schrieb:
volkard schrieb:
tjroamer schrieb:
Die Anforderung ist: meine Klasse muss die public Funktion
Bitte die vollständige Anforderung schreiben. Immer wieder einen halben Satz zu kriegen, der alles umwirft, das ist nicht fein.
Wovon redest du?
tjroamer schrieb:
Die Anforderung ist: meine Klasse muss die public Funktion [...] func(std::vector<Base*> &obj_list)[...] anbieten, um andere sie aufrufen zu können.
Sorry, vielleicht habe ich nicht klar geschrieben. Jetzt ist die konkrete Anforderung:
**Meine Klasse muss den Usern die Funktion
void func(std::vector<Base*> *obj_list);zur Verfügung stellen. Die Funktion muss je nach der Subklasse do_thing_1() oder do_thing_2() richtig aufrufen.
**Gruß,
Kai
-
tjroamer schrieb:
Sone schrieb:
volkard schrieb:
tjroamer schrieb:
Die Anforderung ist: meine Klasse muss die public Funktion
Bitte die vollständige Anforderung schreiben. Immer wieder einen halben Satz zu kriegen, der alles umwirft, das ist nicht fein.
Wovon redest du?
tjroamer schrieb:
Die Anforderung ist: meine Klasse muss die public Funktion [...] func(std::vector<Base*> &obj_list)[...] anbieten, um andere sie aufrufen zu können.
Sorry, vielleicht habe ich nicht klar geschrieben. Jetzt ist die konkrete Anforderung:
**Meine Klasse muss den Usern die Funktion
void func(std::vector<Base*> *obj_list);zur Verfügung stellen. Die Funktion muss je nach der Subklasse do_thing_1() oder do_thing_2() richtig aufrufen.
**Gruß,
Kai
Süßer, wir haben den Code von Base immer noch nicht. Sind wenigstens do_thing_1 und do_thing_2 dort virtuell? Dann würde doch RTTI reichen.
-
BöserBube schrieb:
volkard schrieb:
Übungsaufgabe vom Prof? Dann fehlt mehr Kontext, um zu ahnen, auf was er hinauswill.
Wenns von einem Prof käme könnte der vielleicht einen vptr-Hack erwarten. Standardkonform geht das jedenfalls nur mit den 2^17 ifs (weil unsigned nur von 0 bis 2^16 gehen muss).
@tjroamer: Wenn du wenigstens die Signatur in
std::vector<std::shared_ptr<thing_dispatcher*>>ändern könntest, hättest du noch eine kleine Chance (sofern du die Erstellung der Liste beeinflussen kannst).Es sieht so aus, dass ich 2^32 Mal schreiben muss, um alle möglichen Fälle abzudecken.
Ach nein, da ist ein Troll am Werk. Hat sich erledigt.
ich denke, ich muss aufgeben, der Parameter std::vector<Base*> ist leider nicht änderbar. Vielen Dank an euch allen für eure Zeit und gute Nacht!
Gruß,
Kai
-
volkard schrieb:
tjroamer schrieb:
Sone schrieb:
volkard schrieb:
tjroamer schrieb:
Die Anforderung ist: meine Klasse muss die public Funktion
Bitte die vollständige Anforderung schreiben. Immer wieder einen halben Satz zu kriegen, der alles umwirft, das ist nicht fein.
Wovon redest du?
tjroamer schrieb:
Die Anforderung ist: meine Klasse muss die public Funktion [...] func(std::vector<Base*> &obj_list)[...] anbieten, um andere sie aufrufen zu können.
Sorry, vielleicht habe ich nicht klar geschrieben. Jetzt ist die konkrete Anforderung:
**Meine Klasse muss den Usern die Funktion
void func(std::vector<Base*> *obj_list);zur Verfügung stellen. Die Funktion muss je nach der Subklasse do_thing_1() oder do_thing_2() richtig aufrufen.
**Gruß,
Kai
Süßer, wir haben den Code von Base immer noch nicht. Sind wenigstens do_thing_1 und do_thing_2 dort virtuell? Dann würde doch RTTI reichen.
die Klasse Base und A<N>, B<N> sehen so aus:
class Base { public: Base() {} virtual const char* kind(); virtual const char* name(); virtual ~Base(); }; template<unsigned int N> class A: public Base { public: A() {} void do_thing_1() { // do thing_1 depending on the N } virtual const char* kind() { return "A"; } virtual const char* name() { return "A"; } }; template<unsigned int N> class B: public Base { public: B() {} void do_thing_2() { // do thing_2 depending on the N } virtual const char* kind() { return "B"; } virtual const char* name() { return "B"; } };do_thing_1() und do_thing_2() sind keine virtual

-
Aber Hase! Da sind ja weder do_thing_1 oder ~_2 in der Basisklasse deklariert, geschweige denn virtuell!
Übrigens, die sind so klein? In dem Fall sei doch ein ganz Böser Bezlebub' und schreib die zwei Zeilen da rein - ich nehme die Verantwortung auf mich:
virtual void do_thing_1() = 0; virtual void do_thing_2() = 0;
-
Sone schrieb:
Aber Hase! Da sind ja weder do_thing_1 oder ~_2 in der Basisklasse deklariert, geschweige denn virtuell!
Übrigens, die sind so klein? In dem Fall sei doch ein ganz Böser Bezlebub' und schreib die zwei Zeilen da rein - ich nehme die Verantwortung auf mich:
virtual void do_thing_1() = 0; virtual void do_thing_2() = 0;anscheinend gibt es keinen anderen Weg. OK, ich versuche auf diesen Weg zu gehen. Vielen Dank.
Gruß,
Kai
-
tjroamer schrieb:
Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.
Das ist nicht dein Problem. Dein Problem ist, dass du 2^32+ verschiedene Funktionen hast.
-
camper schrieb:
tjroamer schrieb:
Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.
Das ist nicht dein Problem. Dein Problem ist, dass du 2^32+ verschiedene Funktionen hast.
Fast ein wenig ironisch - Stroustrup schreibt noch, Templates sind gut, um den Maschinencode zu verkürzen

Edit: Oder so ähnlich.
-
camper schrieb:
tjroamer schrieb:
Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.
Das ist nicht dein Problem. Dein Problem ist, dass du 2^32+ verschiedene Funktionen hast.
die Funktion operate() ist als template definiert. Hier ist kein Problem. Der User kann folgenden Code schreiben:
A<13> a_13(); B<1000> b_1000(); std::vector<Base*> obj_list; obj_list.push_back(&a_13); obj_list.push_back(&b_1000); MyClass myclass(); myclass.func(obj_list);MyClass muss solchen Code beherrschen. Das ist mein Problem.
Gruß,
/Kai
-
A<13> a_13();//er wird B<1000> b_1000();//sich wundern std::vector<Base*> obj_list; obj_list.push_back(&a_13);//hier obj_list.push_back(&b_1000); MyClass myclass(); myclass.func(obj_list);
-
volkard schrieb:
A<13> a_13();//er wird B<1000> b_1000();//sich wundern std::vector<Base*> obj_list; obj_list.push_back(&a_13);//hier obj_list.push_back(&b_1000); MyClass myclass(); myclass.func(obj_list);gibt es hier einen Tippfehler oder wie?
Gruß,
Kai
-
Ich sehe es sofort. :stolz:

Edit:
tjroamer schrieb:
volkard schrieb:
A<13> a_13();//er wird B<1000> b_1000();//sich wundern std::vector<Base*> obj_list; obj_list.push_back(&a_13);//hier obj_list.push_back(&b_1000); MyClass myclass(); myclass.func(obj_list);gibt es hier einen Tippfehler oder wie?
Das sind Funktionsdeklarationen.
Guckstdu.
-
Sone schrieb:
Ich sehe es sofort. :stolz:

Edit:
tjroamer schrieb:
volkard schrieb:
A<13> a_13();//er wird B<1000> b_1000();//sich wundern std::vector<Base*> obj_list; obj_list.push_back(&a_13);//hier obj_list.push_back(&b_1000); MyClass myclass(); myclass.func(obj_list);gibt es hier einen Tippfehler oder wie?
Das sind Funktionsdeklarationen.
Guckstdu.OK. Wahrscheinlich habe ich zu einfach geschrieben. Ich wollte schreiben, a_13 und b_1000 sind zwei Klassenobjekten.
sollte sein:
A<13> a_13; B<1000> b_1000;Gruß,
/Kai
-
tjroamer schrieb:
camper schrieb:
tjroamer schrieb:
Das ist fast unmöglich, 2^32 Möglichkeiten aufzulisten.
Das ist nicht dein Problem. Dein Problem ist, dass du 2^32+ verschiedene Funktionen hast.
die Funktion operate() ist als template definiert. Hier ist kein Problem. Der User kann folgenden Code schreiben:
A<13> a_13(); B<1000> b_1000(); std::vector<Base*> obj_list; obj_list.push_back(&a_13); obj_list.push_back(&b_1000); MyClass myclass(); myclass.func(obj_list);MyClass muss solchen Code beherrschen. Das ist mein Problem.
Gruß,
/Kai
Aber der User ist bei Euch und kann auch angewiesen werden, die Liste ein wenig anders zu bauen?
Zum Beispiel ist die Liste ein Template-Listen-Ding, was die Typen der Elemente alle kennt? //Am besten, aber für Dich am schwierigsten und schränkt die Benutzer am meisten ein.
Oder dürfen wir einen Wrapper um A und B bauen, der zusätzlich die Adresse der wichtigen Funktion kennt und nur solche Objekte darf der User anlegen? //Naja, häßlich.
Oder auch nur den Zwang, wenn er ein A<13> benutzt, muß er auch
registerVptrAndFunc<A<13>>();mindestens einmal im Programm aufrufen? //Stört den Benutzer vermutlich am wenigsten und ist auch schnell gebastelt. Leider compilerabhängige Tricks.
-
tjroamer schrieb:
die Funktion operate() ist als template definiert.
Um das Template geht es nicht. Sondern um die daraus instantiierten Funktionen.
Ich hab grad mal im Anhang B (N3337) nachgeguckt - komisch. Sollte doch irgendwie impliziert sein, dass....
-
Wir gehen davon aus, daß die Benutzer nur ein paar, vielleicht mal 50 A- und B-Klassen in einem Projekt benutzt, das sind dann 100 Funktionen. Ok, wenn er sie braucht. Der Compiler erzeugt sie.
Aber wenn Du anmeldest, 2^32 Funktionen zu brauchen, indem Du in lauter if-Zeigen eine der Adressen anfragst, machste die ausführbarre Datei recht groß.
Wäre die erste 400GB große exe-Datei, die ich sehen würde.
Mach mal.
-
volkard schrieb:
Wir gehen davon aus, daß die Benutzer nur ein paar, vielleicht mal 50 A- und B-Klassen in einem Projekt benutzt, das sind dann 100 Funktionen. Ok, wenn er sie braucht. Der Compiler erzeugt sie.
Aber wenn Du anmeldest, 2^32 Funktionen zu brauchen, indem Du in lauter if-Zeigen eine der Adressen anfragst, machste die ausführbarre Datei recht groß.
Wäre die erste 400GB große exe-Datei, die ich sehen würde.
Mach mal.Ja, der Nutzer verwendet nur normalerweise nur bis zur 512 . Ich kann 512*2 if-anweisung manuell schreiben. Ich habe gefragt weil ich dumm fand wenn man solchen hässlichen code schreiben muss. Aber man muss so tun wenn nichts andere geht.
-
volkard schrieb:
Wir gehen davon aus, daß die Benutzer nur ein paar, vielleicht mal 50 A- und B-Klassen in einem Projekt benutzt, das sind dann 100 Funktionen. Ok, wenn er sie braucht. Der Compiler erzeugt sie.
Aber wenn Du anmeldest, 2^32 Funktionen zu brauchen, indem Du in lauter if-Zeigen eine der Adressen anfragst, machste die ausführbarre Datei recht groß.
Wäre die erste 400GB große exe-Datei, die ich sehen würde.
Mach mal.Mach mal.
Ja, der Nutzer verwendet nur normalerweise nur bis zur 512 . Ich kann 512*2 if-anweisung manuell schreiben. Ich habe gefragt weil ich dumm fand wenn man solchen hässlichen code schreiben muss. Aber man muss so tun wenn nichts andere geht.