在C ++或Arduino中,如何在函数中接受未知类型的参数?

时间:2015-07-31 23:12:43

标签: c++ arduino arduino-uno

我尝试使用Serial.print实现简单记录内容的puts方法

void puts(char explanation, void value){
  if (log){
    Serial.print(explanation);
    Serial.println(value); 
  }
}

称之为

puts('hello', 12);puts('hello', 'foo');

目前我收到错误'value' has incomplete type

如果我在声明中使用void* value,我会收到错误invalid conversion from 'int' to 'void'

1 个答案:

答案 0 :(得分:1)

你不能在C / C ++中实际使用“未知”类型;您可以使用任意类型,但某人必须知道如何正确处理它。

幸运的是,只要有人知道如何处理它,C ++就会提供解决方案:模板。我们可以定义一个采用任意类型的函数,编译器将实例化处理所有类型所需的函数副本(如果可能的话):

namespace
{
  template<typename T>
  void puts(char *explanation, T value){
    if (log){
      Serial.print(explanation);
      Serial.println(value); 
    }
  }
}

void loop() {
  puts("hello", 12);
  puts("goodbye", "foo");
  delay(1000);
}

(我们在上面的示例中使用namespace,因为LOL Arduino IDE。)

当然,缺点是每个函数实例化都会占用额外的闪存,这就是为什么你可能不想使用超过3或4的原因,如果你能提供帮助的话。