如何通过C预处理程序指令将这样的调用重新定义为snprintf?
sprintf_s<sizeof(dataFile)>(dataFile, arg2, arg3);
我尝试了这个(不起作用):
#define sprintf_s<sizeof(x)>(args...) snprintf<sizeof(x)>(args)
尤其是因为在相同文件中没有模板的情况下调用sprintf_s我已经需要它:
#define sprintf_s(args...) snprintf(args)
最佳答案
作为mkrs said in his/her answer,预处理器不允许您匹配类似模板的函数调用。
您不需要此任务的预处理器-而是使用可变参数模板:
template <int Size, typename... Ts>
auto sprintf_s(Ts&&... xs)
{
return snprintf<Size>(std::forward<Ts>(xs)...);
}
如果
snprintf
使用 va_arg
,则将需要另一种包装器:template <int Size>
void sprintf_s(char* s, ...)
{
va_list args;
va_start(args, s);
snprintf(args);
va_end(args);
}
有关更多示例,请参见How to wrap a function with variable length arguments?。
关于c++ - 用模板重新定义功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47265249/