Ich weiß, dass diese Frage schon einmal gestellt wurde, aber trotz eines ziemlich erfahrenen Coders verstehe ich nicht die Antworten und sehe keine Möglichkeit, auf diese vorherigen Fragen zu beantworten Klärung. Es gibt keinen "Antwort" -Link oder irgendetwas. Außerdem waren diese Fragen ziemlich alt. Also stelle ich die Frage erneut.Wie Überladen auf Std :: Funktion Signatur in C++
Ich habe eine Klasse, in der ich den + = Operator überbelaste. Ich mag eine Überlastung mit einem nackten Funktionszeiger nehmen, und die andere eine std :: Funktion zu übernehmen:
void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
Verbrauch:
MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
Leider funktioniert der Code nicht kompilieren, da der Compiler nicht bestimmen kann, dass die zweite Überlast für den ersten + = Anruf ungeeignet ist.
Wie definiere ich meine Operator + = Mitgliedsfunktionen, um dieses Problem zu beheben? Ich möchte nicht ändern, wie die Operatoren verwendet werden (z. B. durch Verwendung einer expliziten Umwandlung). Ich möchte, dass sie wie oben gezeigt funktionieren.
Außerdem wäre es sehr nützlich sein, wie auch die folgenden Überlastung haben:
void operator+=(function<void()> handler);
Aber auch hier kann ich nicht auf die Signatur der Funktion basiert Überlastung <> Vorlage.
dieses Themas finden Sie weitere Beispiele: Isn't the template argument (the signature) of std::function part of its type? (Ich habe versucht, die verschiedenen Lösungen in diesem Thread erwähnt Implementierung und keiner von ihnen würde kompilieren)
ich seit vielen Jahren habe in einer Reihe von Programmier Sprachen, aber meine C++ Fähigkeiten sind ein wenig eingerostet.
die ** große ** Frage ist: __ was wirst du mit einem gegebenen Funktionszeiger oder 'std :: function' Objekt in deiner Überladung tun' operator + = '? __ – zaufi
@zaufi: Ich sehe nicht wie das ist relevant, aber in Ordnung. Ich werde es zu einem std :: vector von Event-Handler-Funktionen hinzufügen. Ich implementiere im Wesentlichen .NET-Ereignisse in C++. Denn die Mächte, die still sind, haben nicht den Kopf darauf gedreht, dass Events und Properties - wie Closures - absolut essentielle Funktionalität für eine moderne Programmiersprache sind. –
also, dann müssen Sie einen 'std :: vector' haben, der mit' std :: function' instanziiert ist, mit genau einem (ich schlage 'void()') vor ... Habe ich recht? – zaufi