J'ai un widget dans mon interface graphique qui affiche des graphiques. Si j'ai plus d'un graphique, il y aura une légende affichée dans un rectangle sur l'interface graphique.
J'ai une QStringlist (legendText)
qui contient le texte de la légende. Si aucune légende n'est requise, legendText
serait vide. S'il y aura une légende, legendText
contiendrait le texte.
Pour trouver la hauteur du rectangle autour de la légende, je voudrais faire ce qui suit:
int height = 10;
QStringList legendText;
...
height = height * (legendText->size() > 0);
...
Est-ce une bonne idée/un bon style pour multiplier un int
par un boolean
? Vais-je rencontrer des problèmes avec ça?
C'est techniquement correct, bien qu'un peu flou.
bool
sera prom en int
, donc le résultat est bien défini. Cependant, en regardant ce code, je n'obtiens pas instantanément la sémantique que vous essayez d'atteindre.
J'écrirais simplement quelque chose comme:
height = legendText->isEmpty() ? 0 : height;
Cela rend votre intention beaucoup plus claire.
C'est parfaitement bien selon la norme (§4.5/6):
Une valeur de type
bool
peut être convertie en une valeur de typeint
,false
devenant zéro ettrue
devenant un.
Cependant, je suggère d'utiliser isEmpty
au lieu de comparer size
à zéro height = height * (!legendText->isEmpty());
Ou utilisez l'opérateur conditionnel comme le suggèrent les autres réponses (mais toujours avec isEmpty
au lieu de .size() > 0
)
Vous pouvez utiliser l'opérateur conditionnel (ternaire):
height = ( legendText->size() >0 ) ? height : 0 ;
Peut être ça?
if(legendText->isEmpty())
{
height = 0;
}
ou
int height = legendText->isEmpty() ? 0 : 10;
Certaines personnes peuvent trouver les informations suivantes utiles (le code suivant doit être pris en compte dans les programmes haute performance où chaque cycle d'horloge est important et son but ici est de montrer des techniques alternatives, je ne les utiliserais pas dans cette situation particulière).
Si vous avez besoin d'un code rapide sans branches, vous pouvez implémenter la multiplication int avec booléen à l'aide d'opérateurs au niveau du bit.
bool b = true;
int number = 10;
number = b*number;
peut être optimisé pour:
number = (-b & number);
Si b
est true
alors -b
est -1
et tous les bits sont définis sur 1
. Sinon, tous les bits sont 0
.
Boolean NOT (!b
) peut être implémenté en XOR'ing b
avec 1
(b^1
).
Donc, dans votre cas, nous obtenons l'expression suivante:
height = (-(legendText->isEmpty()^1) & height);