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

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

本文关键字:未知 类型 参数 c++ Arduino 函数      更新时间:2023-10-16

我正在尝试实现一个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,因为LOL Arduino IDE。)

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