用模板重新定义函数

时间:2017-11-13 13:16:46

标签: c++ c-preprocessor

如何通过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)

2 个答案:

答案 0 :(得分:3)

预处理器根本不支持这一点。预处理器与C预处理器大致相同,C没有模板概念。

答案 1 :(得分:2)

作为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?