¿Hay alguna manera de afirmar en tiempo de compilación si una variable es una clase, estructura o un tipo básico en c ++?

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

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

¿Fue útil?

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

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top