2016-06-17 41 views
5

nella documentazione Qt si dice che un qreal è unCome definire un Qreale letterale

Typedef per doppia a meno che Qt è configurato con l'opzione galleggiante -qreal.

Ciò significa quasi sempre double ma float su dispositivi ARM.

Desidero utilizzare i valori letterali qreal tuttavia non so come scriverli.

qreal someValue = calcFunc(); 
qreal min = qMin(someValue, 0.0); 

Dove 0.0 è un double letterale e 0.0f sarebbe un float letterale. Su ARM si tratta di un arresto compilato in quanto non esiste la funzione qMin(float, double).

Potrei scrivere static_cast<qreal>(0.0) ma questo sembra eccessivamente prolisso.

Quindi, come si definisce un valore letterale qreal?

+0

Qual è il problema con 'valore reale = 1.234'? Il compilatore dovrebbe gestire tutte le conversioni, senza bisogno di cast esplicito. –

+0

@KarstenKoop Ho modificato il codice di esempio nella domanda per rendere più chiaro il problema. – Troyseph

+0

È possibile definire un valore letterale definito dall'utente C++ 11 che restituirà qreal. – Velkan

risposta

3

È possibile utilizzare C++ 11 user defined literals:

#include <QtCore> 

constexpr qreal operator "" _qr(long double a){ return qreal(a); } 

int main() { 
    qreal a = 3.0_qr; 
    Q_ASSERT(qMin(a, 4.0_qr) == a); 
} 

Se non sono disponibili sulla vostra piattaforma, è possibile costruire in modo esplicito qreals quando ti serve:

using _qr = qreal; 

int main() { 
    qreal a = _qr(3.0); 
    Q_ASSERT(qMin(a, _qr(4.0)) == a); 
}