2
votes

vérifier si la variable est signée à l'aide de is_signed

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;
}


7 commentaires

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


3 Réponses :


1
votes

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';


0 commentaires

8
votes

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.


3 commentaires

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" .😉



0
votes

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 code> est finalement utilisé dans T (-1) , qui est pour le casting. Si T est un argument non-type comme price , la distribution n'est pas bien formée.


0 commentaires