Was Sie zu tun versuchen, ist mit dem Standard-Präprozessor leider nicht möglich. Es gibt ein paar Gründe:
- Es ist unmöglich, Parameter, die an ein Makro übergeben werden, mit benutzerdefinierten Zeichen zu teilen. Sie müssen durch Kommata getrennt sein. Sonst könnte das dein Problem sofort lösen.
- Sie können den Präprozessor nicht verwenden, um etwas zu definieren, das kein Bezeichner ist. Andernfalls könnten Sie eine doppelte Erweiterung verwenden, wobei
f, int, int,
undmoc
als %code% definiert sind und Argumente aufteilen, als ob sie als %code% übergeben würden, und dann als variadic Argumente verarbeiten. - Die Definition des Funktionszeigers in C ++ erlaubt es leider nicht, den Namen abzuleiten, der dem definierten Typ zugewiesen wurde.
Selbst wenn Sie einen Funktionszeiger erstellen, geht der Code sogar noch weiter, denn um eine Methode aufzurufen, benötigen Sie zwei Zeiger: Zeiger auf die Methode und auf die Klasseninstanz. Dies bedeutet, dass Sie etwas Wrapper um dieses Zeug haben müssen.
Aus diesem Grund verwendet QT seine eigenen Werkzeuge wie %code% , um Klebecode zu generieren.
Das Schliessen, was Sie in Boost gesehen haben könnten, sind wahrscheinlich Signal-, Bind- und Lambda-Bibliotheken. Es ist ironisch, dass diese Bibliotheken viel mächtiger sind als das, was Sie erreichen wollen, aber gleichzeitig erlauben sie Ihnen nicht, es so zu erreichen, wie Sie es wollen. Selbst wenn Sie beispielsweise mit der von Ihnen gewünschten Syntax machen könnten, was Sie wollen, können Sie einen Slot nicht mit einem "Signal" verbinden, wenn das Signal eine andere Signatur hat. Gleichzeitig erlauben die oben erwähnten Bibliotheken von Boost dies völlig. Wenn Ihr "Slot" beispielsweise mehr Parameter erwartet, als "signal" bereitstellt, können Sie andere Objekte binden, die übergeben werden sollen, wenn "slot" aufgerufen wird. Diese Bibliotheken können auch zusätzliche Parameter unterdrücken, wenn "slot" sie nicht erwartet.
Ich würde sagen, der beste Weg aus C ++ prospect wie heute ist es, den Boost-Signal-Ansatz zu verwenden, um die Ereignisbehandlung in GUI-Bibliotheken zu implementieren. QT verwendet es aus verschiedenen Gründen nicht. Zuerst fing es in den 90ern an, als C ++ nicht so ausgefallen war. Außerdem müssen sie Ihren Code analysieren, um mit "Slots" und "Signalen" im Grafik-Designer arbeiten zu können.
Es scheint für mich als statt Makros oder noch schlimmer - nicht-Standard-Tools auf C ++ zu verwenden, um Code zu generieren und das folgende zu verwenden:
%Vor%Es wäre viel besser, so etwas zu tun:
%Vor%Oben funktioniert sowohl für Funktionen als auch für Methoden.