Existe-t-il un moyen de déclarer au moment de la compilation si une variable est une classe, une structure ou un type de base en c ++?

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

  •  06-07-2019
  •  | 
  •  

Question

J'essaie d'implémenter une classe de modèle qui pourrait me dire si une variable est une classe, une structure ou un type de base.

Jusqu'à présent, je suis venu avec ceci:

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;
};

et ussage:

is_class< int >::val; // false
is_class< some_class_type >::val; // true

Le problème est que maintenant je dois écrire une fonction vide vide dans chaque classe qui pourrait être utilisée avec ce code.

Quelqu'un connaît-il une solution à ce problème?

Était-ce utile?

La solution

is_class est un membre de la bibliothèque Boost.Type_Traits. L'implémentation est probablement similaire à ce que vous avez déjà. Vous utiliserez conjointement avec enable_if pour créer la fonction si nécessaire:

template <class T>
   typename enable_if_c<boost::is_class<T>::value>::type 
     foo() {  }

Ou l'équivalent:

template <class T>
   typename enable_if<boost::is_class<T>>::type 
     foo() {  }

La fonction foo n'est générée que si le type T est de type classe.

La valeur renvoyée pour la fonction, si elle est générée, est le deuxième paramètre (omis) du modèle enable_if (la valeur par défaut est void ).

Autres conseils

Utilisez le type traits .

S'il ne s'agit que d'une affirmation pendant la compilation, vous pouvez utiliser BOOST_STATIC_ASSERT et Boost.TypeTraits pour vérifier si les types conviennent. Si vous souhaitez activer un modèle pour des types spécifiques, vous pouvez réussir en utilisant enable_if .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top