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
}
第 1 行对 Func
的调用正确吗?我已经测试了我的程序,它似乎产生了正确的结果。这样写有没有问题或陷阱?
这背后的逻辑: 我想实现一个日志写入类,可以决定将日志写入本地位置或提交到服务器:
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()
和LogOnline()
的参数类型(一个是va_list,另一个是可变参数模板),我决定将WriteLogs()
设置为可变参数函数模板以适应这两个函数:
template<typename... Args>
void WriteLogs(LPCSTR format, Args... args)