In un tipico programma C ++, useresti l' typeid
operatore, in questo modo:
std::cout << typeid(myVar).name();
Tuttavia, ciò richiede una funzione del compilatore chiamata Runtime Type Information (RTTI). È disabilitato nell'IDE di Arduino, presumibilmente perché tende ad aumentare i requisiti di memoria di runtime del programma.
Puoi ottenere maggiori informazioni sul costo delle risorse qui: /programming/579887/how-expensive-is-rtti
Tuttavia, qualsiasi compilatore C ++ completo supporterà sicuramente RTTI. Se si desidera provare a utilizzare un IDE di terze parti (come Eclipse con il plug-in Arduino), è possibile abilitarlo facilmente. Probabilmente non vale la pena solo per questo.
Alternativa
Una soluzione più performante (ma meno flessibile) sarebbe quella di utilizzare un approccio di classe tratti. Ciò comporta alcune meta-programmazioni di template funky:
// 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 )
È possibile aggiungere MAKE_TYPE_INFO(..)
righe per qualsiasi tipo desiderato, inclusi i nomi delle classi personalizzate. È quindi possibile utilizzarlo in questo modo:
int myVar = 17;
Serial.println( TYPE_NAME(myVar) );
Tutto ciò che non definisci usando MAKE_TYPE_INFO(..)
verrà visualizzato come "unknown"
.
Ci sono alcune cose abbastanza avanzate, quindi non proverò a spiegare come funziona tutto qui. Esistono vari tutorial sul web sulla programmazione dei modelli C ++ se sei interessato.
EDIT: Vale la pena notare che l' typeof
operatore non è C ++ standard, ma è supportato da alcuni compilatori, come GCC. È fondamentalmente un equivalente più vecchio di decltype
, che appare nello standard C ++ 11.