En un programa típico de C ++, usaría el typeid
operador, así:
std::cout << typeid(myVar).name();
Sin embargo, eso requiere una característica del compilador llamada Información de tipo de tiempo de ejecución (RTTI). Está deshabilitado en el IDE de Arduino, presumiblemente porque tiende a aumentar los requisitos de memoria de tiempo de ejecución del programa.
Puede obtener más información sobre el costo de los recursos aquí: /programming/579887/how-expensive-is-rtti
Sin embargo, cualquier compilador de C ++ con todas las funciones definitivamente admitirá RTTI. Si desea intentar usar un IDE de terceros (como Eclipse con el complemento Arduino), puede habilitarlo fácilmente. Sin embargo, probablemente no valga la pena solo por eso.
Alternativa
Una solución de mayor rendimiento (pero menos flexible) sería utilizar un enfoque de clase de rasgos. Esto implica una metaprogramación de plantilla original:
// 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 )
Puede agregar MAKE_TYPE_INFO(..)
líneas para cualquier tipo que desee, incluidos los nombres de clases personalizadas. Entonces podría usarlo así:
int myVar = 17;
Serial.println( TYPE_NAME(myVar) );
Cualquier cosa que no defina usando MAKE_TYPE_INFO(..)
aparecerá como "unknown"
.
Eso es algo bastante avanzado, así que no intentaré explicar cómo funciona todo aquí. Sin embargo, hay varios tutoriales en la web sobre programación de plantillas de C ++ si está interesado.
EDITAR: Vale la pena señalar que el typeof
operador no es C ++ estándar, pero es compatible con algunos compiladores, como GCC. Básicamente es un equivalente anterior de decltype
, que aparece en el estándar C ++ 11.