Operator Überladung ... überladen ;-)
-
player4245 schrieb:
dann mach die anderen operatorfunktionen zu normalen (private) funktionen und wenn du mitkriegst das die andere funktion mit einem oder zwei parametern aufgerufen wurde dann rufst du die entsprechenden funktionen auf.
Ist eine ganz gute Idee. Nur leider werde ich nicht mitbekommen, ob da jemand was auf den Stack gepusht hat oder nicht.
-
FrEEzE2046 schrieb:
Ich kann dir exakt sagen, welches Argument dann wie und wo auf dem Stack liegt und von welchem Typ es ist.
Heißt das du kannst es mir sagen, willst aber nicht? Ich würde es sehr gerne wissen, wenn du da eine interessante Lösung hast.
Ich setze einfach mal auf eure Kreativität, denn aktuell fällt mir nichts "schönes" ein.
Mir fällt da außer einem speziellen Typen als ersten Parameter nichts ein.
enum dummytype { blubb}; operator()(dummytype, ...) {...}
-
Registrierter Troll schrieb:
FrEEzE2046 schrieb:
Ich kann dir exakt sagen, welches Argument dann wie und wo auf dem Stack liegt und von welchem Typ es ist.
Heißt das du kannst es mir sagen, willst aber nicht? Ich würde es sehr gerne wissen, wenn du da eine interessante Lösung hast.
Wenn du wüsstest, in welcher Klasse es sich befindet, wie die Struktur ist etc. dann könntest du es nachvollziehen.
Ich will nicht unhöflich sein und es hat daher auch nichts damit zu tun, dass ich es dir nicht sagen will. Da der Code jedoch an der Arbeit entsteht, darf ich ihn leider nicht veröffentlichen.
-
du könntest folgendes versuchen:
operator() (); //null parameter operator() (int); //wie gehabt template <class T> operator() (T); //spezielle form deines gewünschten op mit 1 Parametern template <class T, class U> operator() (T, U); //spezielle Form deines gewünschten op mit 2 Parametern operator() (int, int, int); //wie gehabt template <class T, class U, class V> operator() (T, U, V); //spezielle Form deines gewünschten op mit 3 Parametern template <class T, class U, class V> operator() (T, U, V, ...); //dein gewünschter op mit 4 und mehr Parameterndie templates biegst du alle einfach auf eine memberfunktion um, die eine normale ellipse als Parameter hat. (btw: ellipsen sind pfui...)
-
Natürlich geht das. Bloss kannst du dir nicht aussuchen welche Funktion als besser bewertet und ausgewählt wird. Die "..." Funktion wird immer fix als schlechter bewertet, und kommt daher nur dran, wenn andere Funktionen nicht möglich sind:
#include <iostream> struct foo { void operator () (int a) { std::cout << "a\n"; } void operator () (int a, int b, int c) { std::cout << "a, b, c\n"; } void operator () (...) { std::cout << "...\n"; } }; struct int_convertible { operator int() const { return 123; } }; struct long_convertible { operator long() const { return 123; } }; struct int_convertible_convertible { operator int_convertible() const { return int_convertible(); } }; int main(int argc, char** argv) { foo f; f(1); // a f(1, 2); // ... f(1, 2, 3); // a, b, c f(1, 2, 3, 4); // ... f("..."); // ... f(foo()); // ... // selbst hier wird die "..." funktion schlechter bewertet f('a'); // a f(1.1); // a f(123ull); // a f(int_convertible()); // a f(long_convertible()); // a (zwei konvertierungen! allerdings nur eine user-defined, daher OK, und a wird gewählt) // das *geht* nichtmehr mit a, daher kommt "..." dran: // (zwei user-defined conversions hintereinander werden nicht berücksichtigt) f(int_convertible_convertible()); return 0; }
-
Ein viel wichtigeres Problem hat sich aufgetan. Ich benutze das Visual Studio 2008 Team Suite Edition und der C/C++ Optimization Compiler stürzt ständig ab.
Ist zwar nicht gerade so, dass ich nicht wüsste, was ihm da missfällt. Ich würde jedoch gerne die Optimierung für diesen Code-Abschnitt ausschalten.
Ein
#pragma optimize( "", off )hilft leider nicht.
-
hustbaer schrieb:
Natürlich geht das. Bloss kannst du dir nicht aussuchen welche Funktion als besser bewertet und ausgewählt wird. Die "..." Funktion wird immer fix als schlechter bewertet, und kommt daher nur dran, wenn andere Funktionen nicht möglich sind
Bei mir sagt (oben genannter) Compiler:
error C3066: there are multiple ways that an object of this type can be called with these argumentsIch habe allerdings auch noch einen (void) Fall!
-
Ist zwar nicht gerade so, dass ich nicht wüsste, was ihm da missfällt. Ich würde jedoch gerne die Optimierung für diesen Code-Abschnitt ausschalten.
Code in eine eigene Compilierungseinheit (sprich: cpp-Datei) auslagern und entsprechende Einstellungen fuer diese Datei vornehmen.
Und zu deinem ganzen Problem jetzt die nicht ganz so einfache Antwort: In C gibt es va_list, fuer C++ hier mit Beispielen: http://www.cplusplus.com/reference/clibrary/cstdarg/ .
Edit: Ich sehe aber grad, das hustbaer schon darauf verwiesen hat.
-
knivil schrieb:
Code in eine eigene Compilierungseinheit (sprich: cpp-Datei) auslagern und entsprechende Einstellungen fuer diese Datei vornehmen.
Und zu deinem ganzen Problem jetzt die nicht ganz so einfache Antwort: In C gibt es va_list, fuer C++ hier mit Beispielen: http://www.cplusplus.com/reference/clibrary/cstdarg/ .
1. Was heißt entsprechende Einstellungen? Auch nach deaktivierten Optimierung kommt der Fehler.
2. Ich kann va_list, aber dass hat nicht direkt mit meinem Problem zu tun, oder worauf willst du hinaus?
-
Hm.
OK, das checkt der MSVC dann nimmer - wundert mich jetzt auch etwas, aber ist halt so. Müsste mal im Standard nachlesen was der dazu sagt.Den parameterlosen Overload weglassen, so dass bei Aufruf ohne Parameter einfach die "..." Variante ausgewählt wird ginge für dich nicht?
-
Ist zwar nicht gerade so, dass ich nicht wüsste, was ihm da missfällt
Was misfällt ihm denn?
-
hustbaer schrieb:
Den parameterlosen Overload weglassen, so dass bei Aufruf ohne Parameter einfach die "..." Variante ausgewählt wird ginge für dich nicht?
Nein, leider nicht. Ich kann per Assembler ja schlecht überprüfen, ob da was auf dem Stack liegt oder nicht (außer den lokalen Variablen versteht sich).
hustbaer schrieb:
Ist zwar nicht gerade so, dass ich nicht wüsste, was ihm da missfällt
Was misfällt ihm denn?
Hat nichts mit dem Thema hier zu tun, aber:
Mittlerweile kommt die Meldung nicht mehr, dennoch möchte er folgenden Code nicht compilieren:template<class Container, typename R, typename P1, R (Container::*Func)(P1)>bei jedem Template Argument sagt er:
could not deduce template argument for 'R' // das gleiche für P1 und Func
-
FrEEzE2046 schrieb:
template<class Container, typename R, typename P1, R (Container::*Func)(P1)>bei jedem Template Argument sagt er:
could not deduce template argument for 'R' // das gleiche für P1 und FuncMangles code kann man wiedermal nur raten was da schief läuft. Meine Glaskugel mutmaßt dass du da ein Funktionstemplate hast und es ohne Angabe der Templateparameter aufrufst, und dass die Funktionsparameter nicht ausreichen um die Templateparameter herzuleiten.
-
pumuckl schrieb:
Mangles code kann man wiedermal nur raten was da schief läuft. Meine Glaskugel mutmaßt dass du da ein Funktionstemplate hast und es ohne Angabe der Templateparameter aufrufst, und dass die Funktionsparameter nicht ausreichen um die Templateparameter herzuleiten.
Es existiert noch gar kein Code. Aber so lässt sich der Fehler generieren:
template<class Container, typename R, typename P1, R (Container::*Func)(P1)> blub() { } //Aufruf: class Bla { public: int methode(int) {return 0;} void ui() { blub<Bla, int, int, &methode>(); } };
-
1. Was heißt entsprechende Einstellungen? Auch nach deaktivierten Optimierung kommt der Fehler.
Ich habe dir nur gesagt, wie man die Optimierung ausschaltet. Der Fehler wird durch deinen Quelltext verursacht und hat nichts mit Optimierung zu tun.
-
knivil schrieb:
1. Was heißt entsprechende Einstellungen? Auch nach deaktivierten Optimierung kommt der Fehler.
Ich habe dir nur gesagt, wie man die Optimierung ausschaltet. Der Fehler wird durch deinen Quelltext verursacht und hat nichts mit Optimierung zu tun.
Warum kommt dann die Meldung vom Optimization Compiler?
-
Ich glaube, du mußt explizit die Klasse angeben, d.h.
blub<Bla, int, int, &Bla::methode>();
-
FrEEzE2046 schrieb:
Warum kommt dann die Meldung vom Optimization Compiler?
Weil der Microsoft Compiler nunmal ein optimierender Compiler ist, auch wenn die Optimierungen abgeschaltet sind?
So wie ein Auto in der Lage ist zu fahren, auch wenn der Motor jetzt gerade mal ausgeschaltet ist.
Th69 schrieb:
Ich glaube, du mußt explizit die Klasse angeben, d.h.
blub<Bla, int, int, &Bla::methode>();Vöölig richtig. Es gibt keine Funktion &methode (zumindest nicht im Beispiel). Nur &Bla::methode.
-
Ich habs inzwischen gelöst.
Bzgl. des Compilers: Da hier extra der Name "Optimization" auftauchte, liegt der Verdacht doch nahe, dass es sich um einen Teil des Compilers handelt, der nur für Optimierung gedacht ist oder?
-
Liegt nahe, ist aber falsch.
Der Compiler von Microsoft für die Sprachen C und C++ heißt nunmal (auf deutsch) "Microsoft C/C++-Optimierungscompiler".
Sehr gut nachzuvollziehen auch wenn Du cl.exe ohne Optionen startest.