13 votes

Comment std::is_integral est-il implémenté ?

Je ne suis pas familier avec la magie de Template en cpp. Après avoir lu ce que "TemplateRex" a dit dans ce document enlace j'ai été confus sur la façon dont std::is_intergral fonctionne.

template< class T >
struct is_integral
{
    static const bool value /* = true if T is integral, false otherwise */;
    typedef std::integral_constant<bool, value> type;
};

Je peux comprendre le fonctionnement de SFINAE et le fonctionnement des traits. Après avoir consulté Référence cpp Une implémentation de "is_pointer" a été trouvée à la place de "is_integral" qui ressemble à ceci :

template< class T > struct is_pointer_helper     : std::false_type {};
template< class T > struct is_pointer_helper<T*> : std::true_type {};
template< class T > struct is_pointer : is_pointer_helper<typename std::remove_cv<T>::type> {};

Est-ce que 'is_integral' a une implémentation similaire ? Comment ?

15voto

skypjack Points 5516

De aquí nous l'avons :

Vérifie si T est un type intégral. Fournit la valeur de la constante membre qui est égale à true, si T est le type bool , char , char16_t , char32_t , wchar_t , short , int , long , long long ou tout type d'entier étendu défini par l'implémentation, y compris les variantes signées, non signées et qualifiées cv. Sinon, la valeur est égale à false.

Quelque chose comme ça est probablement sur le chemin que vous pouvez mettre en œuvre :

template<typename> struct is_integral_base: std::false_type {};

template<> struct is_integral_base<bool>: std::true_type {};
template<> struct is_integral_base<int>: std::true_type {};
template<> struct is_integral_base<short>: std::true_type {};

template<typename T> struct is_integral: is_integral_base<std::remove_cv_t<T>> {};

// ...

Notez que std::false_type y std::true_type sont des spécialisations de std::integral_constant . Voir aquí pour plus de détails.

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