Ist es möglich, variadische Signal und verbinden generic Lambda als Slot zu schaffen? Ich meine, so etwas wie (sagen wir, alle Definitionen der beteiligten Funktionen sichtbar sind, wo erforderlich (zB an den Punkten der Instanziierung)):Variadische Signale und allgemeine lambdas
#include <QCoreApplication>
#include <QObject>
#include <QTime>
class A
: public QObject
{
Q_OBJECT
public :
A(QObject * const parent = Q_NULLPTR)
: QObject{parent}
{ ; }
signals :
template< typename ...Ts >
void infoMessage(Ts... args);
public slots :
void run()
{
emit infoMessage("Started at ", QTime::currentTime());
}
};
#include <QTimer>
#include <QtDebug>
#include "main.moc"
int main(int argc, char * argv [])
{
QCoreApplication a{argc, argv};
A a;
auto printInfoMessage = [&] (auto... args)
{
(qInfo() << ... << args);
};
QObject::connect(&a, SIGNAL(infoMessage), printInfoMessage);
QTimer::singleShot(0, &a, &A::run);
return a.exec();
}
Derzeit gibt es eine Fehlermeldung:
AUTOGEN: error: process for main.cpp:18: Error: Template function as signal or slot
moc failed...
Hier Makro SLOT()
statt von &A::infoMessage
hilft nicht viel. Gibt es Workarounds, um diese Einschränkung zu überwinden?
Ich weiß, dass einige der Antworten eine Verwendung von std::make_tuple
und std::index_sequence
Zeug enthalten werden. Aber gibt es weniger ausführliche Lösung?
Ist es nicht möglich, um alle Varianten der Instanziierung der Elementfunktion auf 'emit someSignal (...);' Punkten zu sammeln und dann alle entsprechenden Spezialisierungen direkt vor dem Verknüpfen zu generieren? – Orient
Nein. Das 'moc' wird vor jeder Kompilierung aufgerufen und verarbeitet nur Dateien mit dem Makro Q_OBJECT. Die Ausgabe von moc ist C++ - Code, der zur gleichen Zeit kompiliert wird, wenn Ihre eigenen C++ - Dateien kompiliert werden. Die Verbindungszeit ist also viel zu spät für den Moc, um irgendeine Funktion hinzuzufügen. Die Link-Zeit ist aber auch viel zu früh, um irgendwelche Anwendungsfälle Ihrer Template-Funktion zu kennen (zB wenn Sie eine Library erstellen, die Binärdatei, die Ihre Library verwendet, generiert eigene Funktionen basierend auf Ihrer Vorlage) –
Was denken Sie: ist Ist es möglich, all diese Einschränkungen zu überwinden, wenn statische Reflexion verfügbar wurde? Oder vielleicht können einige Teile der "Clang" -Infrastruktur hier helfen? – Orient