如何将可变数量的参数转发给另一个函数?

jav*_*red 12 c++

在我的应用程序中,我有很多日志.我确实在一个叫做的地方累积了所有日志中的所有错误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(例如,printfvprintf).在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)

  • 您绝对可以使用可变参数模板转发到 C 可变参数函数。[实例](http://melpon.org/wandbox/permlink/0fbi8R2PCrOJkeFv) (2认同)

小智 5

总之,你不能.

你所能做的就是编写一个等价的成员函数,它接受一个va_list而不是变量的参数,然后传递初始化的函数va_list.

  • 也许有人希望它更短?或者他们是喜欢写 OC(OH)2 的有机化学家?很难说,真的。 (2认同)