Existe uma maneira para compilar em tempo assert se uma variável é uma classe, struct ou um tipo básico em C ++?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando implementar uma classe de modelo que seria capaz de me dizer se uma variável é uma classe, estrutura ou um tipo básico.

Até agora eu vim com isso:

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

O problema é que agora eu preciso escrever uma função void em branco em cada classe que pode ser utilizado com este código.

Alguém sabe uma solução para este problema?

Foi útil?

Solução

is_class é um membro da biblioteca Boost.Type_Traits. A implementação é provavelmente semelhante ao que você já tem. Você usaria em em conjunto com enable_if para criar a função se for o caso:

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

Ou o equivalente:

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

A função foo é gerado somente se o tipo T é do tipo classe.

O valor de retorno para a função, se ele é gerado, é o segundo parâmetro (omitido) para o modelo enable_if (o padrão é void).

Outras dicas

Use impulso do tipo traços .

Se é só afirmando durante o tempo de compilação, você poderia usar BOOST_STATIC_ASSERT e Boost.TypeTraits para verificar se os tipos são adequados. Se você deseja ativar um modelo para tipos específicos, você pode ter sucesso usando Boost enable_if .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top