Existe uma maneira para compilar em tempo assert se uma variável é uma classe, struct ou um tipo básico em C ++?
-
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?
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 .