我有一个较大的代码库来执行log_msg("Here comes %s", "the text")
,其中log_message
是一个宏,它将函数名和行号添加到日志消息中。
当格式字符串与提供的参数不匹配时,GCC/G++会警告错误。不幸的是,有时代码会调用log_msg(get_the_text())
。get_the_text()
的返回值在编译时是未知的,因此如果它包含一些printf
格式序列,代码将完全失败。
我正在寻找的是一种通过不同的代码路径来路由单参数用法的方法,该路径不解释格式化代码。我尝试了这样的方法,希望非变异病例比变异病例更具体:
void log_the_message_implementation(const char *filename, const char *funcname, const char *msg);
void log_the_message_implementation(const char *filename, const char *funcname, const char *msg, ...);
我希望编译器在没有变量args的情况下选择单参数函数,但它抱怨调用不明确。
如何在不更改来自log_msg(get_the_text())
到log_msg("%s", get_the_text())
?
感谢@SamVarshavchik,这就是我想到的:
#include <iostream>
#include <cstdio>
#include <tuple>
template<typename ... Args>
void log(Args ... args) {
if (sizeof...(args) == 1) {
auto t = std::make_tuple(args...);
std::puts(std::get<0>(t));
} else {
std::printf(args...);
}
}
int
main() {
log("Test %d");
log("%s %dn", "Test", 1);
log([]{ return "%s";}());
return 0;
}