Answers:
在典型的C ++程序中,您将使用typeid
运算符,如下所示:
std::cout << typeid(myVar).name();
但是,这需要一种称为运行时类型信息(RTTI)的编译器功能。可以在Arduino IDE中将其禁用,大概是因为它会增加程序的运行时内存需求。
您可以在此处获取有关资源成本的更多信息:https : //stackoverflow.com/questions/579887/how-expensive-is-rtti
但是,任何功能齐全的C ++编译器肯定会支持RTTI。如果您想尝试使用第三方IDE(例如带有Arduino插件的Eclipse),则可以轻松启用它。虽然这可能不值得麻烦。
替代方案
高性能(但灵活性较差)的解决方案是使用特征类方法。这涉及一些时髦的模板元编程:
// 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 )
您可以MAKE_TYPE_INFO(..)
为所需的任何类型添加行,包括自定义类的名称。然后,您可以像这样使用它:
int myVar = 17;
Serial.println( TYPE_NAME(myVar) );
您未定义使用的任何内容MAKE_TYPE_INFO(..)
都会显示为"unknown"
。
那是一些相当高级的东西,所以我不会在这里解释它是如何工作的。如果您有兴趣的话,网上有很多关于C ++模板编程的教程。
编辑:值得注意的是,该typeof
运算符不是标准的C ++,但受一些编译器(例如GCC)支持。它基本上是的较旧版本decltype
,它出现在C ++ 11标准中。
我使用一种简单的愚蠢方法...
void types(String a){Serial.println("it's a String");}
void types(int a) {Serial.println("it's an int");}
void types(char* a) {Serial.println("it's a char*");}
void types(float a) {Serial.println("it's a float");}
这是观念的多态性,其中多种功能,但与创建具有不同的参数类型相同的函数名。在运行时,将调用与正确数量的参数和参数类型匹配的函数。希望这种解释有所帮助。