2010-12-27 19 views
8

OK, prima di darmi una lezione sull'uso delle funzioni variadiche in C in C++ ... tutto il resto si è rivelato necessario per non dover riscrivere il Qt MOC.Funzioni QT e variad.

Quello che mi piacerebbe sapere è se è possibile avere uno "slot" in un oggetto Qt che accetta una quantità/tipo di argomenti arbitrari. Il fatto è che voglio davvero essere in grado di generare oggetti Qt dotati di slot di una firma arbitraria. Poiché il MOC è incompatibile con la preelaborazione standard e con i modelli, non è possibile farlo con un approccio diretto. Ho appena si avvicinò con un'altra idea:

struct funky_base : QObject 
{ 
    Q_OBJECT 
    funky_base(QObject * o = 0); 

public slots: 
    virtual void the_slot(...) = 0; 
}; 

Se questo è possibile, allora, perché si può fare un modello che è una sottoclasse di un oggetto QObject derivato fino a quando non si dichiara novità Qt in esso, Dovrei essere in grado di implementare un tipo di modello derivato che prende il materiale ... e lo trasforma nei tipi appropriati e previsti.

Se lo è, come posso collegarmi ad esso? Funzionerebbe?

connect(x, SIGNAL(someSignal(int)), y, SLOT(the_slot(...))); 

Se nessuno ha provato nulla questa folle e non sa fuori mano, sì, io alla fine provo io stesso ... ma sto sperando che qualcuno ha già conoscenze esistenti posso toccare prima eventualmente di sprecare il mio tempo su esso.


La domanda è stata un tentativo di trovare un modo per progettare un 'catch-all' classe base per un oggetto basato su modelli che potrebbe tradursi segnali Qt in segnali statici come boost :: signals2 o funzioni solo di base. Ho pensato che se potessi costruire uno slot con modelli variadici, potrei usare TMP per ricostruire i parametri al di fuori dei va_args. La risposta al problema è stata esattamente la stessa, ma taglia PRIMA che lo slot venga chiamato dal meccanismo qt. La prima rata di una serie di articoli su come rendere il tutto ha mostrato come ho risolto questa parte del problema:

http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html

Questa è la mia posizione vecchia blog. Una nuova è nel mio profilo se vuoi vedere altri strani sh1t.

+2

NVM, ho risposto alla mia domanda. Qt ovviamente non è nemmeno in grado di farlo. –

+1

Con gli slot non tipizzati stai dando via uno dei vantaggi principali del linguaggio ... la sicurezza del tipo in fase di compilazione. –

+2

Frank, franco, franco. Qt lo ha già fatto. Sto cercando di recuperare la sicurezza del tipo. Questo è stato un tentativo fallito. Vedi il mio blog per l'eventuale storia di successo (è sul mio profilo). –

risposta

2

A quanto pare la gente continua a pensare che questa domanda abbia ancora bisogno di risposta perché diverse settimane dopo averlo chiesto e poi ho risposto personalmente, le persone stanno ancora postando le loro risposte. Quindi suppongo di dover rendere esplicitamente una risposta al posto di entrambi nella domanda stessa e nel primo commento per questo:

Non è possibile utilizzare una funzione variadica come segnale o slot in Qt.

Ho dedicato molto tempo e impegno non solo alla risoluzione del problema e alla condivisione, ma alla spiegazione del modo in cui il problema è stato risolto. Per favore, considera di leggere, potresti persino imparare qualcosa di nuovo.

+1

Non è un problema su SO per rispondere alla tua stessa domanda;) –

1

Tutto ciò che serve per risolvere questo problema sarà brutto, ma non dovresti fare tutto il lavoro pesante da solo. È possibile utilizzare boost::any o boost::variant come tipo di argomento e quindi eseguire il roll di un oggetto per contenere gli argomenti necessari (oppure utilizzare un vettore di qualsiasi tipo/variante).

Puoi anche usare QVariant, ma non è bello come boost :: variant, e certamente non così flessibile (per un prezzo) come boost :: any.

(Oppure basta riscrivere Qt con boost :: signals o trX :: variant, come ora viviamo nel 21 ° secolo.Inoltre, non troppo a ragionare sugli sviluppatori di Qt per lo stato dei segnali/slot - il C++ - funzionalità che potenziano: gli usi dei segnali non erano comunemente supportati dai compilatori C++ quando Trolltech sviluppava la loro implementazione di segnali/slot).

-1

Si noti che le costruzioni "..." non possono prendere oggetti "reali", perché C++ non si è mai preoccupato di estendere la sintassi "...".

Questo è in realtà una buona notizia nel tuo caso, perché significa che il seguente suggerimento potrebbe effettivamente funzionare per te senza doversi preoccupare del C++ che auto-distrugge i tuoi oggetti.

Quello che potresti fare è creare un oggetto semplice il cui costruttore prende un "...".Passerebbe attraverso i suoi argomenti, scaricandoli in una matrice allocata dinamicamente. Quindi potresti passare quell'oggetto singolo allo slot.

Diciamo che sei un dattilografo pigro e chiamato quell'oggetto V (per la variante o variadic o qualsiasi altra cosa). Poi si potrebbe chiamare una funzione che prende V come questo:

function(V("one", "two", "three", NULL)); 

Naturalmente, ogni visitatore avrebbe dovuto costruire V a mano, che forse non è esattamente quello che speravano.

+0

Non ho votato, ma "non dovermi preoccupare del C++ che auto-distrugge i tuoi oggetti" è una dichiarazione piuttosto pericolosa. Altrimenti sarei d'accordo per la maggior parte. Gli oggetti C++ con distruttori dovrebbero essere automaticamente distrutti. Non averlo significa bypassare un meccanismo fondamentale nella lingua. – stinky472