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_signedest 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é.