在 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 个。
我正在尝试实现一种 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 个。