Qt und variadic Funktionen

8

OK, bevor ich mich mit der Verwendung von C-ähnlichen Variadic-Funktionen in C ++ beschäftigt habe ... alles andere hat sich als nichts anderes herausgestellt, als das Qt MOC neu zu schreiben.

Was ich gerne wissen würde, ist, ob Sie einen "Slot" in einem Qt-Objekt haben können, das eine beliebige Menge / Art von Argumenten enthält. Die Sache ist, dass ich wirklich in der Lage sein möchte, Qt-Objekte zu generieren, die Slots einer beliebigen Signatur haben. Da der MOC mit der Standard-Vorverarbeitung und mit Vorlagen nicht kompatibel ist, ist dies mit keinem direkten Ansatz möglich. Ich habe gerade eine andere Idee gefunden:

%Vor%

Wenn das möglich ist, dann, weil Sie eine Vorlage erstellen können, die eine Unterklasse eines abgeleiteten QObject-Objekts ist, solange Sie darin kein neues Qt-Zeug deklarieren, sollte ich in der Lage sein, einen abgeleiteten Template-Typ zu implementieren das ... stuff und verwandelt es in die passenden, erwarteten Typen.

Wenn ja, wie würde ich mich damit verbinden? Würde das funktionieren?

%Vor%

Wenn niemand etwas versucht hat, das verrückt ist und nichts von der Hand weiß, werde ich es irgendwann selbst versuchen ... aber ich hoffe, dass jemand bereits vorhandenes Wissen hat, das ich tippen kann, bevor ich möglicherweise meine Zeit damit verschwenden kann.

Diese Frage war ein Versuch, eine "catch-all" Basisklasse für ein Vorlagenobjekt zu entwickeln, das Qt Signale in statische Signale wie boost :: signals2 oder nur Basisfunktionen übersetzen kann. Ich dachte, wenn ich einen Slot konstruieren könnte, der variadische Templates brauchte, könnte ich TMP verwenden, um die Parameter aus den va_args zu rekonstruieren. Die Antwort auf das Problem war ziemlich genau das, aber schneidet ein, bevor der Slot vom qt-Mechanismus aufgerufen wird. Die erste Ausgabe einer Artikelserie, wie man das Ganze macht, zeigte, wie ich diesen Teil des Problems gelöst habe:

Ссылка

Das ist mein alter Blog-Standort. Neue ist in meinem Profil, wenn Sie andere seltsame sh1t sehen wollen.

    
Crazy Eddie 27.12.2010, 21:47
quelle

3 Antworten

2

Offenbar denken die Leute immer noch, dass diese Frage immer noch eine Antwort braucht, denn einige Wochen nachdem ich sie gefragt und dann selbst beantwortet habe, posten die Leute immer noch ihre Antworten. Ich denke also, ich muss es explizit beantworten, und zwar sowohl in der Frage selbst als auch im ersten Kommentar:

Sie können eine variadische Funktion nicht als Signal oder Slot in Qt verwenden.

Ich habe viel Zeit und Mühe darauf verwendet, nicht nur das Problem zu lösen und zu teilen, sondern auch zu erklären, WIE das Problem gelöst wurde. Bitte beachten Sie das Lesen, vielleicht lernen Sie sogar etwas Neues.

    
Crazy Eddie 03.02.2011, 17:12
quelle
1

Alles, um dieses Problem zu lösen, wird hässlich sein, aber Sie sollten nicht all das schwere Heben selbst machen müssen. Sie können boost :: any oder boost::variant als Argumenttyp und rolle dann ein Objekt, das die benötigten Argumente enthält (oder verwende einen Vektor) von irgendwelchen / varianten Typen).

Sie können QVariant auch verwenden, aber es ist nicht so schön wie boost :: variant und sicherlich nicht so flexibel (für einen Preis) wie boost :: any.

(Oder schreibt Qt einfach mit boost :: signals oder der trX :: Variante um, so wie wir jetzt im 21. Jahrhundert leben. Schimpft auch nicht zu sehr auf den Qt-Entwicklern für den Zustand der Signale / Slots - die C ++ - Funktionen, die boost :: signals verwendet, wurden von C ++ - Compilern nicht häufig unterstützt, wenn Trolltech ihre Implementierung von Signal / Slots entwickelte).

    
Nick Bastin 31.01.2011 04:04
quelle
-1

Beachten Sie, dass "..." -Konstruktionen keine "echten" Objekte annehmen können, weil C ++ sich nie darum gekümmert hat, die "..." -Syntax zu erweitern.

Das ist eigentlich eine gute Nachricht in Ihrem Fall, weil es bedeutet, dass der folgende Vorschlag tatsächlich für Sie funktioniert, ohne dass Sie befürchten müssen, dass C ++ Objekte automatisch zerstört.

Sie können ein einfaches Objekt erstellen, dessen Konstruktor ein "..." annimmt. Es würde seine Argumente durchlaufen und sie in ein dynamisch zugewiesenes Array ablegen. Dann könnten Sie dieses einzelne Objekt an den Slot übergeben.

Nehmen wir an, Sie sind ein fauler Typist und haben dieses Objekt V (für variant oder variadic oder was auch immer) genannt. Dann könnten Sie eine Funktion aufrufen, die V so nimmt:

%Vor%

Natürlich müsste jeder Anrufer V von Hand konstruieren, was vielleicht nicht genau das ist, worauf Sie gehofft haben.

    
apenwarr 03.02.2011 10:43
quelle

Tags und Links