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 ++?
-
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?
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 .