使用模板重新定义函数

Posted

技术标签:

【中文标题】使用模板重新定义函数【英文标题】:redefining a function with a template 【发布时间】:2017-11-13 13:16:45 【问题描述】:

如何通过对 snprintf 的 C 预处理器指令重新定义这样的调用?

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)

【问题讨论】:

什么是dataFile,你认为sizeof(dataFile)会做什么? 不太清楚你到底想要什么,但也许只是#define sprintf_s snprintf 应该会有所帮助。 【参考方案1】:

预处理器根本不支持。预处理器在很大程度上与 C 预处理器相同,并且 C 没有模板的概念。

【讨论】:

OP 要求 C 预处理器,即(希望)与 C 预处理器大致相同... 它也被标记为 C++。为 C++ 代码调用 C 预处理器就更没有意义了。 您知道如何在不重写实际代码的情况下将其重定向到适当的 Linux 函数吗? 为什么它没有意义?此外,预处理器不需要知道模板以使其替换一些导致模板调用的符号 预处理器将宏识别为字母数字字符串。参数可以有括号,但是一旦预处理器看到&lt;,替换的可能性就结束了。【参考方案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?。

【讨论】:

不幸的是,这给了我以下编译器错误:不同指针类型的比较 ('int ()(char *__restrict, size_t, const char *__restrict, ...) throw()' (aka 'int ()(char *__restrict, unsigned long, const char *__restrict, ...) throw()') and 'int *') 我不得不承认我刚开始使用模板和仍然不时发现它们令人困惑。 @EXIT_FAILURE:啊,它使用va_args。见***.com/questions/41400/…

以上是关于使用模板重新定义函数的主要内容,如果未能解决你的问题,请参考以下文章

Azure Functions ARM 模板重新部署会删除我发布的函数

从木偶视图重新加载部分车把将无法访问为父视图中的部分模板元素定义的 ui 对象

tp5 跨模块调用模板 所有的变量也要重新定义吗

C ++ ERROR将参数重新发送到模板函数(矩阵参数)

在 Django 中的 AJAX POST 请求后重新加载模板

如何在发布模式下使用宏重新定义函数?