如何获取变量的数据类型?


9

我正在使用Arduino,我想知道是否有一个函数返回变量的数据类型。也就是说,我想运行如下内容:

// Note: 'typeof' is a sample function that should return the data type.
Serial.println(typeof(myVar));

5
为什么需要这样做?自您声明变量以来,变量的类型应为已知
sachleen 2014年

Answers:


15

在典型的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标准中。


非常翔实和彻底的答案!不胜感激
Omer 2014年

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");} 

这是观念的多态性,其中多种功能,但与创建具有不同的参数类型相同的函数名。在运行时,将调用与正确数量的参数和参数类型匹配的函数。希望这种解释有所帮助。


您能否稍微扩展一下答案,简要说明其工作原理?
Greenonline '17

我必须手动重写它,因为复制粘贴会导致我不理解的问题。手动重新输入草图后,它就像一个草图一样工作。非常有用...
novski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.