合并函数参数包和默认参数

问题描述 投票:3回答:1

我有一个带有参数包的函数:

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为空,0file,并且"a"line

实际上,在编写问题时,我发现显式传递Targs是有效的:

tprintf<int, char*>("%d%s", 0, "a");

是否有可能避免这种情况?

c++ variadic-templates variadic-functions parameter-pack
1个回答
0
投票

如何使用可变参数宏?

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");
}
© www.soinside.com 2019 - 2024. All rights reserved.