Mentre leggevo this question, mi sono imbattuto nella risposta di @Johannes.Sintassi di template diversa per trovare se l'argomento è una classe oppure no
template<typename> struct void_ { typedef void type; };
template<typename T, typename = void> // Line 1
struct is_class { static bool const value = false; };
template<typename T>
struct is_class<T, typename void_<int T::*>::type> { // Line 2
static bool const value = true;
};
Questo costrutto rileva se il given type is a class or not. Quello che mi imbarazza è il nuovo tipo di sintassi per scrivere questo piccolo meta-programma. Qualcuno può spiegare in dettaglio:
- Perché abbiamo bisogno della linea 1?
- Qual è il significato della sintassi
<int T::*>
come parametrotemplate
nella riga 2?
Perché passando per 'struct is_class :: type>' (invece del più semplice 'struct is_class ') necessario? (La seconda compilazione ma non fornisce il risultato desiderato) –
AProgrammer
@AProgrammer: Come si compila la seconda se non si conosce il tipo di classe?Come sceglieresti il default, che in questo caso è 'typename = void'? – Xeo
Perché 'void _ :: type' e il parametro predefinito nella prima versione di' is_class' (ad esempio 'typename = void') deve essere uguale? – iammilind