C'è un modo per affermare in fase di compilazione se una variabile è una classe, una struttura o un tipo di base in c ++?
-
06-07-2019 - |
Domanda
Sto cercando di implementare una classe modello che sarebbe in grado di dirmi se una variabile è una classe, una struttura o un tipo di base.
Finora sono arrivato con questo:
template< typename T >
class is_class
{
private:
template< typename X >
static char ( &i_class( void(X::*)() ) )[1];
//
template< typename X >
static char ( &i_class( X ) )[2];
public:
static bool const val = sizeof( i_class< T >(0) ) == 1;
};
e ussage:
is_class< int >::val; // false
is_class< some_class_type >::val; // true
Il problema è che ora ho bisogno di scrivere una funzione vuota vuota in ogni classe che potrebbe essere utilizzata con questo codice.
Qualcuno conosce una soluzione a questo problema?
Soluzione
is_class
è un membro della libreria Boost.Type_Traits. L'implementazione è probabilmente simile a quella che hai già. Utilizzerai insieme a enable_if
per creare la funzione, se del caso:
template <class T>
typename enable_if_c<boost::is_class<T>::value>::type
foo() { }
O l'equivalente:
template <class T>
typename enable_if<boost::is_class<T>>::type
foo() { }
La funzione foo
viene generata solo se il tipo T
è di tipo classe.
Il valore restituito per la funzione, se viene generato, è il secondo parametro (omesso) al modello enable_if
(il valore predefinito è void
).
Altri suggerimenti
Usa i tratti del tipo >.
Se si sta affermando solo durante la compilazione, è possibile utilizzare BOOST_STATIC_ASSERT
e Boost.TypeTraits per verificare se i tipi sono adatti. Se vuoi abilitare un modello per tipi specifici, potresti avere successo usando enable_if .