Applicazione di una funzione sovraccaricata / basata su modelli in base al tipo di QVariant

1

Sto provando a prendere un QVariant (in questo caso da un QProperty generato su una classe) e in base al tipo, restituire un QWidget che consente di modificarlo in modo appropriato.

una firma per la funzione di conversione potrebbe essere simile a questa:

template<typename T>
QWidget * createWidget(const QString& label, const T& value, QWidget * parent = nullptr);

Tuttavia, poiché ho a che fare con QVariant s, ho bisogno di un modo per attivare il tipo di QVariant per scegliere la funzione corretta overload / template.

La mia idea era di avere semplicemente una gigantesca istruzione switch e specializzare un modello per ogni tipo (al fine di evitare una sostituzione errata del sovraccarico, in particolare con tipi int-like)

vale a dire:

QWidget *createDisplayWidget(const QString &label, const QVariant &q_variant,
                            QWidget *parent = nullptr) {
    QWidget *display_widget = nullptr;
    switch (q_variant.userType()) {
        case QMetaType::Bool:
            display_widget = createWidget(label, q_variant.value<bool>(), parent);
            break;
        case QMetaType::Int:
            display_widget = createWidget(label, q_variant.value<int>(), parent);
            break;
         ....
         ....
         ....
    }
    return display_widget;
}

Mi stavo chiedendo ci sono alternative legittime a questo approccio con diversi compromessi? Non riesco a pensare a nessun altro metodo per svolgere questo compito, o qualcosa che si adatta meglio al mio caso d'uso. Mi sembra chiaro e solo la nuova funzione e un caso aggiuntivo sullo switch dovranno essere aggiornati con nuovi tipi, ma ciò è anche restrittivo in quanto richiederà la ricompilazione di quella porzione di codice.

    
posta opa 06.07.2018 - 18:04
fonte

0 risposte

Leggi altre domande sui tag