Em um programa C ++ típico, você usaria o typeid
operador da seguinte maneira:
std::cout << typeid(myVar).name();
No entanto, isso requer um recurso do compilador chamado Runtime Type Information (RTTI). Ele está desativado no IDE do Arduino, provavelmente porque tende a aumentar os requisitos de memória de tempo de execução do programa.
Você pode obter mais informações sobre o custo do recurso aqui: /programming/579887/how-expensive-is-rtti
Qualquer compilador C ++ com recursos completos definitivamente suportará RTTI. Se você quiser tentar usar um IDE de terceiros (como o Eclipse, com o plug-in do Arduino), poderá ativá-lo facilmente. Provavelmente não vale a pena o aborrecimento apenas por isso.
Alternativa
Uma solução de melhor desempenho (mas menos flexível) seria usar uma abordagem de classe de características. Isso envolve alguma meta-programação de modelos:
// Generic catch-all implementation.
template <typename T_ty> struct TypeInfo { static const char * name; };
template <typename T_ty> const char * TypeInfo<T_ty>::name = "unknown";
// Handy macro to make querying stuff easier.
#define TYPE_NAME(var) TypeInfo< typeof(var) >::name
// Handy macro to make defining stuff easier.
#define MAKE_TYPE_INFO(type) template <> const char * TypeInfo<type>::name = #type;
// Type-specific implementations.
MAKE_TYPE_INFO( int )
MAKE_TYPE_INFO( float )
MAKE_TYPE_INFO( short )
Você pode adicionar MAKE_TYPE_INFO(..)
linhas para qualquer tipo que desejar, incluindo os nomes de classes personalizadas. Você poderia usá-lo assim:
int myVar = 17;
Serial.println( TYPE_NAME(myVar) );
Tudo o que você não definir usando MAKE_TYPE_INFO(..)
será exibido como "unknown"
.
Isso é algo bastante avançado, então não tentarei explicar como tudo funciona aqui. Existem vários tutoriais na Web sobre programação de modelos C ++, se você estiver interessado.
EDIT: Vale a pena notar que o typeof
operador não é C ++ padrão, mas é suportado por alguns compiladores, como o GCC. É basicamente um equivalente antigo decltype
, que aparece no padrão C ++ 11.