【发布时间】:2020-09-24 17:27:56
【问题描述】:
我有一个带参数包的函数:
template<typename... Targs>
void tprintf(const char* format, Targs... args) {}
(实现无关紧要,只是签名)。我想使用 GCC/Clang 内置函数将源位置添加为默认参数。类似的东西
template<typename... Targs>
void tprintf(const char* format, Targs... args,
const char* file = __builtin_FILE(),
unsigned line = __builtin_LINE()) {}
这可以编译,但是对它的调用并没有像我希望的那样将参数传递给args;例如
tprintf("%d%s", 0, "a");
提供(在 Clang 10 上)
<source>:7:5: error: no matching function for call to 'tprintf'
tprintf("%d%s", 0, "a");
^~~~~~~
<source>:2:6: note: candidate function template not viable: no known conversion from 'const char [2]' to 'unsigned int' for 3rd argument
void tprintf(const char* format, Targs... args,
^
这似乎表明args 是空的,0 是file,"a" 是line。
实际上,在编写问题时,我发现明确传递 Targs 有效:
tprintf<int, char*>("%d%s", 0, "a");
是否可以避免这种情况?
【问题讨论】:
-
clang 和 gcc 编译对我来说没问题,如果我
#define同时__builtin_FILE()__和__builtin_LINE()__
标签: c++ variadic-templates variadic-functions parameter-pack