在我的应用程序中,我有很多日志.我确实在一个叫做的地方累积了所有日志中的所有错误errorsLogger.我用这种方式实现了它:
static Logger errorsLogger;
....
void Logger::Error(std::string format, ...) {
va_list arglist;
va_start(arglist, format);
if (this != &errorsLogger) {
errorsLogger.Error(format, arglist); // how to forward parameters?
}
vfprintf(logFile, , format.c_str(), arglist);
fprintf(logFile, "\n");
fflush(logFile);
va_end( arglist );
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码没有按预期工作errorsLogger包含一些奇怪的字符串 - 似乎变量参数没有传递.如何修复我的代码有效?
Jon*_*rdy 23
C中的典型公式是具有两个函数,一个接受...,一个接受va_list(例如,printf对vprintf).在C++中,使用重载这样做很方便:
// public
void Logger::Error(const std::string& format, ...) {
va_list args;
va_start(args, format);
Error(format, args);
va_end(args);
}
// private
void Logger::Error(const std::string& format, va_list args) {
if (this != &errorsLogger)
errorsLogger.Error(format, args);
vfprintf(logFile, format.c_str(), args);
fprintf(logFile, "\n");
fflush(logFile);
}
Run Code Online (Sandbox Code Playgroud)
使用C++ 11,可以直接使用可变参数模板.您还可以将参数转发给C风格的可变参数函数.
template<class... Args>
void Logger::Error(const std::string& format, Args&&... args) {
if (this != &errorsLogger)
errorsLogger.Error(format, std::forward<Args>(args)...);
fprintf(logFile, format.c_str(), std::forward<Args>(args)...);
fprintf(logFile, "\n");
fflush(logFile);
}
Run Code Online (Sandbox Code Playgroud)
小智 5
总之,你不能.
你所能做的就是编写一个等价的成员函数,它接受一个va_list而不是变量的参数,然后传递初始化的函数va_list.