¿Hay alguna manera de afirmar en tiempo de compilación si una variable es una clase, estructura o un tipo básico en c ++?
-
06-07-2019 - |
Pregunta
Estoy tratando de implementar una clase de plantilla que pueda decirme si una variable es una clase, estructura o un tipo básico.
Hasta ahora he llegado con esto:
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;
};
y uso:
is_class< int >::val; // false
is_class< some_class_type >::val; // true
El problema es que ahora necesito escribir una función vacía en blanco en cada clase que pueda usarse con este código.
¿Alguien sabe una solución a este problema?
Solución
is_class
es miembro de la biblioteca Boost.Type_Traits. La implementación es probablemente similar a la que ya tienes. Lo usaría junto con enable_if
para crear la función, si corresponde:
template <class T>
typename enable_if_c<boost::is_class<T>::value>::type
foo() { }
O el equivalente:
template <class T>
typename enable_if<boost::is_class<T>>::type
foo() { }
La función foo
solo se genera si el tipo T
es de tipo clase.
El valor de retorno para la función, si se genera, es el segundo parámetro (omitido) de la plantilla enable_if
(el valor predeterminado es void
).
Otros consejos
Utilice los rasgos de tipo boost de boost >.
Si solo se afirma durante el tiempo de compilación, puede usar BOOST_STATIC_ASSERT
y Boost.TypeTraits para verificar si los tipos son adecuados. Si desea habilitar una plantilla para tipos específicos, puede tener éxito con enable_if .