Sto cercando di capire l'implementazione di std::is_class
. Ho copiato alcune possibili implementazioni e le ho compilate, sperando di capire come funzionano. Fatto questo, trovo che tutti i calcoli siano fatti durante la compilazione (come avrei dovuto capire prima, guardando indietro), quindi gdb non può darmi dettagli su cosa sta succedendo esattamente.Come funziona questa implementazione di std :: is_class?
L'implementazione sto lottando per capire è questo:
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> {};
Ho problemi con le due linee commentato. Questa prima riga:
template<class T> char test(int T::*);
Che cosa significa il T::*
? Inoltre, questa non è una dichiarazione di funzione? Sembra uno, eppure questo compila senza definire un corpo di funzione.
La seconda linea che voglio capire è:
template<class T> two test(...);
Ancora una volta, questo non è una dichiarazione di funzione con nessun corpo mai definito? Inoltre cosa significa l'ellissi in questo contesto? Pensavo che un'ellissi come argomento di funzione richiedesse un argomento definito prima dello ...
?
Mi piacerebbe capire cosa sta facendo questo codice. So che posso semplicemente utilizzare le funzioni già implementate dalla libreria standard, ma voglio capire come funzionano.
Riferimenti:
Le funzioni * dichiarazioni * non contengono un corpo. Questo è per le definizioni. –
Le definizioni di funzione SONO una dichiarazione di funzione, Karoly. Il fatto che tu stia scegliendo è che tutte le definizioni sono dichiarazioni, ma non tutte le dichiarazioni sono definizioni. – Peter