【问题标题】: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 应该会有所帮助。

标签: c++ c-preprocessor


【解决方案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。见stackoverflow.com/questions/41400/…
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2014-01-02
相关资源
最近更新 更多