首页 > 解决方案 > 是否可以将可变参数模板参数传递给 va_list?

问题描述

Is it possible to pass va list to variadic template的镜像问题

在我的测试项目中,有一个功能:

void Func(LPCSTR format, ...) {
    va_list args;
    va_start(args, format);
    char buffer[256];
    vsprintf_s(buffer, 256, format, args);
    printf("%s\n", buffer);
    va_end(args);
}

我写了一个模板函数:

template<typename... Args>
void FuncTemp(LPCSTR format, Args... args) {
    Func(format, args...);    //#1
}

Func第 1 行的调用正确吗?我已经测试了我的程序,它似乎产生了正确的结果。这样写有问题或陷阱吗?


这背后的逻辑:我想实现一个日志写入类,它可以决定将日志写入本地位置或提交到服务器:

Class LogWriting{
public:
...
    LogTypes mLogType;
    void WriteLogs(...){
        switch (mlogType) {
            case(LogTypes::local): {
                // need to call <void LogLocal(LPCSTR format, ...)> here
                // which CANNOT be changed.
                break;
            }
            case(LogTypes::online): {
                // need to call
                /* template<typename... Args>
                   void LogOnline(LPCSTR format, Args... args)
                   {
                       std::string strFormat = std::string(format);
                       std::string logMessage = fmt::sprintf(strFormat, args...);
                       reportLog(logMessage);
                   }
                 */
                 // which CANNOT be changed.
                break;
            }
            ...
         }
};

因为我不能改变LogLocal()and的参数类型LogOnline()(一个是va_list,另一个是可变参数模板),我决定设置WriteLogs()为可变参数函数模板来适应这两个函数:

template<typename... Args>
void WriteLogs(LPCSTR format, Args... args)

标签: c++templates

解决方案


推荐阅读