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

In C++ or Arduino, how do you accept an argument of unknown type in a function?

我正在尝试实现一种 puts 方法,该方法仅使用 Serial.print

记录内容
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'

你实际上不能在 C/C++ 中使用 "unknown" 类型;你可以使用任意类型,但是有人必须知道如何正确处理它。

幸运的是,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 因为 。)

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