9 votes

Quel est l'intérêt de savoir si un objet est un nombre entier ou non, ou s'il est de type classe ou non ?

Bonjour, j'ai vu de nombreux exemples comme celui-ci sur Cppreference.com:

std::is_class
std::is_integral

Et ainsi de suite. Je sais que si je lance le code par exemple, j'obtiens true ou false. Mais en quoi est-ce utile? Par exemple, savoir si l'objet est de type classe ou non?

#include 
#include 

struct A {};
class B {};
enum class C {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_class::value << '\n';
    std::cout << std::is_class::value << '\n';
    std::cout << std::is_class::value << '\n';
    std::cout << std::is_class::value << '\n';
}

**

La sortie:

true
true
false
false
  • J'ai cherché partout un exemple réel utilisant ceci (is_class, is_integral, is_arithmetic, ...) Mais tous les tutoriels montrent seulement l'exemple désespéré: seulement true ou false.

  • Quelqu'un pourrait-il m'aider avec un petit exemple utile utilisant ces templates?

**

1 votes

Un exemple simple - std::copy. Et si les types de std::copy sont "simples", comme un tableau d'int ou de char? Vous utiliseriez memcpy, n'est-ce pas? Alors comment dire "Si le type est simple, utilisez memcpy, sinon utilisez une boucle "lente" "?

17voto

Lightness Races in Orbit Points 122793

Ce n'est certainement pas pour écrire sur la console, c'est sûr.

Plus largement, vous demandez : quel est l'intérêt des attributs de type?

La réponse est la méta-programmation de modèles. Par exemple, je peux créer une spécialisation de modèle qui fait une chose pour les types intégraux et une autre pour les types non intégraux.

Aaron Bullman a une introduction simple aux attributs de type, tout comme Jacek ici.

À mon avis, la plupart des utilisations de ces choses se trouveront enfouies dans les implémentations de fonctionnalités intéressantes et de classes et utilitaires (c'est-à-dire dans les bibliothèques) en tant que partie de la machinerie de fond qui fait fonctionner le tout.

Lecture complémentaire :

La réponse de rightfold sur le premier de ceux-ci donne un superbe exemple de l'utilité des traits:

Par exemple, une implémentation de std::copy peut utiliser std::memcpy en interne au lieu d'une boucle explicite lorsque les itérateurs sont des pointeurs vers des POD. Cela peut être réalisé avec SFINAE.

0 votes

Alors, cela signifie par exemple que je peux les utiliser pour désactiver certaines instances de modèles pour un type spécifique. Par exemple, il est logique de désactiver une fonction templatisée Power ou une classe lorsque le type de l'argument n'est pas entier, disons std::string.

1 votes

@RamiYen, Oui, c'est ce qu'on appelle SFINAE.

7voto

Richard Critten Points 879

C'est pour la méta-programmation de modèles. Lorsque vous n'avez aucune idée du/des type(s) que l'utilisateur final passera dans le modèle. Parfois c'est pour signaler des erreurs, parfois c'est pour se spécialiser sur les types passés. Parfois c'est une combinaison.

Les exemples vus sur cppreference.com (par exemple https://en.cppreference.com/w/cpp/types/is_enum) sont très simplifiés et montrent simplement comment utiliser le trait d'une manière non typique. Vous n'utiliseriez presque jamais directement ces traits dans une fonction ou une classe simple (non modèle).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X