Je veux vérifier si la variable est signée. J'ai trouvé un modèle de classe dont le nom est is_signed mais je ne peux pas l'utiliser depuis que je suis nouveau pour C ++. Comment puis-je vérifier que la variable est signée?
#include <iostream> #include <cmath> int main() { // the following short initialization is on purpose short price {10u}; std::cout << std::is_signed<price>::value << '\n'; return 0; }
3 Réponses :
Les arguments des modèles de classes doivent être des types. Si vous avez une variable et que vous souhaitez obtenir son type, vous pouvez utiliser decltype:
std::cout << std::is_signed<decltype (price)>::value << '\n';
is_signed
- comme beaucoup d'autres de ces structures est un moyen d'effectuer une vérification sur un type - mais pas sur une variable . vous pouvez utiliser decltype
pour obtenir le type sous-jacent de vos variables.
std::cout << std::is_signed<decltype(price)>::value << '\n'; //-> 1
Aussi - is_signed
est défini dans
et non dans
.
comme déjà mentionné dans les commentaires; si votre intention est simplement de voir si la variable est positive ou négative , vous n'aurez besoin d'aucun utilitaire de bibliothèque.
Pour obtenir ces informations, utilisez respectivement price> 0
ou price . Il s’agit bien sûr d’opérations d’exécution uniquement.
La méthode C ++ 14 est un peu plus simple: cout << std :: is_signed
@ Red.Wave et la méthode C ++ 17 sont plus simples: cout << std :: is_signed_v
@RemyLebeau simple "plus simple" est faux. Cela aurait dû être "encore plus simple" .😉
l'implémentation de is_signed
peut être quelque chose comme
template<bool IsArithmetic, typename T> struct is_signed_impl : bool_constant<T(-1) < T(0)> {}; template<typename T> struct is_signed_impl<false, T> : false_type {}; template<typename T> struct is_signed : is_signed_impl<is_arithmetic_v<T>, T> {};
la variable de modèle T
dans is_signed
T (-1)
price
, la distribution n'est pas bien formée.
is_signed
est pour les types et non pour les variables.std :: cout << std :: is_signed :: value << '\ n';
@john merci pour le point, mais qu'en est-il de mon intention?
"Je veux vérifier si la variable est signée." - vous savez s'il a signé, car vous l'avez défini.
essayez
is_signed
Si vous voulez savoir si un type signé est positif ou négatif, comparez-le à zéro.
if (price <0) {std :: cout << "price is negative \ n"; }
@concurrencyboy Et quelle est votre intention? Que voulez-vous réaliser?
La variable est toujours signée car c'est un
short
. Peu importe que vous l'ayez initialisé à partir d'un littéral non signé.