In einem typischen C ++ - Programm würden Sie den typeid
Operator folgendermaßen verwenden:
std::cout << typeid(myVar).name();
Dies erfordert jedoch eine Compilerfunktion namens Runtime Type Information (RTTI). Es ist in der Arduino IDE deaktiviert, vermutlich weil es dazu neigt, den Laufzeitspeicherbedarf des Programms zu erhöhen.
Weitere Informationen zu den Ressourcenkosten erhalten Sie hier: /programming/579887/how-expensive-is-rtti
Jeder voll funktionsfähige C ++ - Compiler wird RTTI jedoch definitiv unterstützen. Wenn Sie versuchen möchten, eine IDE eines Drittanbieters (z. B. Eclipse mit dem Arduino-Plugin) zu verwenden, können Sie diese problemlos aktivieren. Es ist wahrscheinlich nicht die Mühe wert, nur dafür.
Alternative
Eine leistungsstärkere (aber weniger flexible) Lösung wäre die Verwendung eines Merkmalsklassenansatzes. Dies beinhaltet einige funky Template-Meta-Programmierung:
// 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 )
Sie können MAKE_TYPE_INFO(..)
Zeilen für jeden gewünschten Typ hinzufügen , einschließlich der Namen benutzerdefinierter Klassen. Sie könnten es dann so verwenden:
int myVar = 17;
Serial.println( TYPE_NAME(myVar) );
Alles, was Sie nicht mit definieren, MAKE_TYPE_INFO(..)
wird als angezeigt "unknown"
.
Das sind ziemlich fortgeschrittene Sachen, also werde ich nicht versuchen zu erklären, wie das alles hier funktioniert. Es gibt verschiedene Tutorials im Web über die Programmierung von C ++ - Vorlagen, wenn Sie interessiert sind.
BEARBEITEN: Es ist erwähnenswert, dass der typeof
Operator kein Standard-C ++ ist, sondern von einigen Compilern wie GCC unterstützt wird. Es ist im Grunde ein älteres Äquivalent von decltype
, das im C ++ 11-Standard erscheint.