C'è un modo per affermare in fase di compilazione se una variabile è una classe, una struttura o un tipo di base in c ++?

StackOverflow https://stackoverflow.com/questions/828442

  •  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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top