我有一个带有参数包的函数:
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");
给予(在lang语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");
是否有可能避免这种情况?
如何使用可变参数宏?
template<typename... Targs>
void tprintfhelper(const char* f, int l, const char* format, Targs... )
{
std::cout << format << " " << l << " " << f << std::endl;
}
#define tprintf(...) tprintfhelper(__builtin_FILE(), __builtin_LINE() __VA_OPT__(,) ##__VA_ARGS__)
int main()
{
tprintf("%d", 1, 2, 3, 4, 5, "dog");
}