Entfernen einer Parameterliste von f (Liste) mit Präprozessor

9

Es scheint mir, dass ich in einer Boost-Bibliothek etwas Seltsames gesehen habe und dass es genau das ist, was ich jetzt versuche. Kann es aber nicht finden ...

Ich möchte ein Makro erstellen, das eine Signatur annimmt und es in einen Funktionszeiger verwandelt:

%Vor%

Ich brauche das vor allem, um mit Mitgliedsfunktionszeigern zu arbeiten, damit WAS zwei Parameter benötigt:

%Vor%

Es ist nicht unbedingt notwendig, um mein Problem zu lösen, aber es würde die Dinge einen Tick netter machen.

Diese Frage hat per se nichts mit Funktionszeigern zu tun. Was getan werden muss, ist, den Präprozessor zu verwenden, um "f (int, int)" zu nehmen und es in zwei verschiedene Teile umzuwandeln:

'f' '(int, int)'

Warum:

Ich habe das hier angesprochene Problem gelöst: Qt Q_OBJECT generieren Klassen pragmatisch

Ich habe eine Reihe von Artikeln gestartet, die erklären, wie es geht: Ссылка Ссылка

Die Signatur muss von dem "Signal", mit dem der Benutzer eine Verbindung herstellen will, ausgewertet werden und genau übereinstimmen. Qt-Benutzer sind es gewohnt, dies als SIGNAL(fun(param,param)) auszudrücken, also würde sich etwas wie connect_static(SIGINFO(object,fun(param,param)), [](int,int){}) nicht zu seltsam anfühlen.

Um die Signatur zu erstellen, muss ich sie aus den übergebenen Argumenten herausziehen können. Es gibt genug Informationen, um die Memberfunktionsadresse zu erhalten (mit Dekodentyp von C ++ 0x) und die Signatur zu holen, um den passenden Wrapper zu erzeugen, aber ich kann nicht sehen, wie ich ihn herausbekomme. Der nächste, den ich mir vorstellen kann, ist SIGINFO(object, fun, (param,param)) , was wahrscheinlich gut genug ist, aber ich dachte mir, ich würde hier fragen, bevor ich es für unmöglich halte, die genaue Syntax zu bekommen, die ich bevorzugen würde.

    
Crazy Eddie 05.01.2011, 20:19
quelle

1 Antwort

1
___ qstnhdr ___ Entfernen einer Parameterliste von f (Liste) mit Präprozessor ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ qstntxt ___

Es scheint mir, dass ich in einer Boost-Bibliothek etwas Seltsames gesehen habe und dass es genau das ist, was ich jetzt versuche. Kann es aber nicht finden ...

Ich möchte ein Makro erstellen, das eine Signatur annimmt und es in einen Funktionszeiger verwandelt:

%Vor%

Ich brauche das vor allem, um mit Mitgliedsfunktionszeigern zu arbeiten, damit WAS zwei Parameter benötigt:

%Vor%

Es ist nicht unbedingt notwendig, um mein Problem zu lösen, aber es würde die Dinge einen Tick netter machen.

Diese Frage hat per se nichts mit Funktionszeigern zu tun. Was getan werden muss, ist, den Präprozessor zu verwenden, um "f (int, int)" zu nehmen und es in zwei verschiedene Teile umzuwandeln:

'f' '(int, int)'

Warum:

Ich habe das hier angesprochene Problem gelöst: Qt Q_OBJECT generieren Klassen pragmatisch

Ich habe eine Reihe von Artikeln gestartet, die erklären, wie es geht: Ссылка Ссылка

Die Signatur muss von dem "Signal", mit dem der Benutzer eine Verbindung herstellen will, ausgewertet werden und genau übereinstimmen. Qt-Benutzer sind es gewohnt, dies als ( auszudrücken, also würde sich etwas wie ) nicht zu seltsam anfühlen.

Um die Signatur zu erstellen, muss ich sie aus den übergebenen Argumenten herausziehen können. Es gibt genug Informationen, um die Memberfunktionsadresse zu erhalten (mit Dekodentyp von C ++ 0x) und die Signatur zu holen, um den passenden Wrapper zu erzeugen, aber ich kann nicht sehen, wie ich ihn herausbekomme. Der nächste, den ich mir vorstellen kann, ist , , was wahrscheinlich gut genug ist, aber ich dachte mir, ich würde hier fragen, bevor ich es für unmöglich halte, die genaue Syntax zu bekommen, die ich bevorzugen würde.

    
___ tag123cpreprocessor ___ Der Makrovorverarbeitungsschritt der Programmiersprachen C und C ++. Dieser Tag kann auch für Fragen zu anderen Compilern / Sprachen verwendet werden, die von identischen Funktionen abgeleitet sind oder diese enthalten, wie z. B. die #Direktiven in Objective-C oder C #. ___ antwort5005835 ___

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, und moc 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.

    
___
user405725 15.02.2011 15:44
quelle

Tags und Links