J'essaie de comprendre la mise en œuvre de std::is_class
. J'ai copié quelques implémentations possibles et les ai compilées, dans l'espoir de comprendre comment elles fonctionnent. Cela fait, je trouve que tous les calculs sont faits pendant la compilation (comme j'aurais dû le découvrir plus tôt, en regardant en arrière), donc gdb ne peut pas me donner plus de détails sur ce qui se passe exactement.Comment fonctionne cette implémentation de std :: is_class?
La mise en œuvre que j'ai du mal à comprendre est celui-ci:
template<class T, T v>
struct integral_constant{
static constexpr T value = v;
typedef T value_type;
typedef integral_constant type;
constexpr operator value_type() const noexcept {
return value;
}
};
namespace detail {
template <class T> char test(int T::*); //this line
struct two{
char c[2];
};
template <class T> two test(...); //this line
}
//Not concerned about the is_union<T> implementation right now
template <class T>
struct is_class : std::integral_constant<bool, sizeof(detail::test<T>(0))==1
&& !std::is_union<T>::value> {};
Je vais avoir du mal avec les deux lignes de commentaires. Cette première ligne:
template<class T> char test(int T::*);
Que signifie le T::*
? Aussi, n'est-ce pas une déclaration de fonction? Cela ressemble à un, mais cela compile sans définir un corps de fonction.
La deuxième ligne que je veux comprendre est:
template<class T> two test(...);
Encore une fois, est-ce pas une déclaration de fonction sans corps jamais défini? Que veut dire l'ellipse dans ce contexte? Je pensais qu'une ellipse en tant qu'argument de la fonction nécessitait un argument défini avant le ...
?
Je voudrais comprendre ce que fait ce code. Je sais que je peux simplement utiliser les fonctions déjà implémentées de la bibliothèque standard, mais je veux comprendre comment elles fonctionnent.
Références:
Les fonctions * déclarations * ne contiennent pas de corps. C'est pour les définitions. –
Définition des fonctions ARE une déclaration de fonction, Karoly. Le nit que vous choisissez est que toutes les définitions sont des déclarations, mais toutes les déclarations ne sont pas des définitions. – Peter