在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
,因为LOL Arduino IDE。)
当然,缺点是每个函数实例化占用额外的flash,这就是为什么如果可以的话,您可能不希望使用超过3或4个。
相关文章:
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 线程 std::调用未知类型,无法专门化函数错误
- MacOS 上的 LLVM - 标准文件 iosfwd 中未知类型名称'template'
- C++ 未知类型名称,即使类型是通过标头定义的
- 通过模板函数对未知类型调用方法
- 错误:使用 SWIG 的未知类型名称"类"
- C++:将未知类型的对象存储为成员变量的类
- 为什么未知类型名称"Complejo"?
- 在 Mac OS x 中制造期间出现错误未知类型名称"constexpr"
- 查找上下文RPC_NS_HANDLE未知类型名称
- 错误:未知类型名称"功能跟踪"
- C++中的自由定理:模板是否本质上对未知类型的对象无知和中立?
- 未知 使用用于C++代码的标头编译 C 代码时char16_t未知类型名称
- Linux中未知类型名称UINT64_T和UINT16_T UINT8_T
- 如何确定未知类型数组的索引是否为空
- 当我返回节点*时,C++中出现未知类型错误
- 无法编译任何C++程序;错误:未知类型名称'uint8_t'