C++ 在没有写入正文的函数中重载运算符2次

C++ 在没有写入正文的函数中重载运算符2次,c++,arduino,operator-overloading,C++,Arduino,Operator Overloading,目前,我有以下代码: void writeLog(__FlashStringHelper* mes){ Serial.println(mes); if(!logfile){ logfile = SD.open(logpath,FILE_WRITE); if(!logfile) return; } logfile.write(mes); } void writeLog(char* mes){ Serial.println(mes); if(!l

目前,我有以下代码:

void writeLog(__FlashStringHelper* mes){

  Serial.println(mes);

  if(!logfile){
    logfile = SD.open(logpath,FILE_WRITE);
    if(!logfile) return;
  }

  logfile.write(mes);

}

void writeLog(char* mes){

  Serial.println(mes);

  if(!logfile){
    logfile = SD.open(logpath,FILE_WRITE);
    if(!logfile) return;
  }

  logfile.write(mes);

}
有没有一种方法可以重载一个函数来接受char*和u FlashStringHelper*,而不必写两次正文


谢谢

如果可以使用模板,请尝试以下操作:

template <typename T>
void writeLog(T mes) {

    Serial.println(mes);

    if (!logfile) {
        logfile = SD.open(logpath, FILE_WRITE);
        if (!logfile) return;
    }

    logfile.write(mes);

}
模板
无效写日志(T mes){
串行打印LN(mes);
如果(!日志文件){
logfile=SD.open(日志路径,文件写入);
如果(!logfile)返回;
}
日志文件写入(mes);
}
这正是我们的目的!您只需在案例中编写一个模板函数,如下所示:

模板
无效写日志(T mes)
{
串行打印LN(mes);
如果(!日志文件){
logfile=SD.open(日志路径,文件写入);
如果(!logfile)返回;
}
日志文件写入(mes);
}
然后可以使用任何有效类型的参数调用它。如果您试图使用没有兼容版本的
Serial.println
logfile.write
调用的参数类型调用它,那么编译器将给出一个错误。否则,当您进行有效调用时,编译器将为相应的real函数生成代码。因此,您的
main
可能看起来像这样:

intmain()
{
字符文本[256];
writeLog(text);//确定:编译器将生成与第二个函数等效的代码
__促卵泡刺激素;
writeLog(&fsh);//确定:编译器将生成与第一个函数等效的代码
INTP;
//writeLog(p);//错误:没有带int参数的“Serial.println()”和“logfile.write()”的合适版本
返回1;
}
编辑:如果知道对函数的所有调用都将使用指针类型作为参数,则可以通过将参数指定为指针使模板更具体(从而更好地检测误用):

模板
无效写日志(T*mes)
{
//...

谢谢大家,我找到了解决方案! Arduino IDE附带了一个名为String的类。它支持来自uu FlashStringHelper*和char*的隐式强制转换

void writeLog(String mes){

  Serial.println(mes);

  if(!logfile){
    logfile = SD.open(logpath,FILE_WRITE);
    if(!logfile) return;
  }

  logfile.println(mes);

}

writeLog("A string from RAM");
writeLog(F("A string from flash memory"));

使用模板怎么样?