通常,将 C++11 可变参数模板功能与函数一起使用需要基于可变参数的函数参数位于函数参数列表中的最后一个。有一个例外;如果有 C 级可变参数,它们是倒数第二个参数,它必须是最后一个。
template < typename ...Args >
int super_printf( Something x, Args &&...a, ... );
我有时会随机想到 C++,我想知道如何实现这样的功能。我首先想到了通常从a中递归剥离参数,然后我记得 C 级可变参数不会级联。我必须立即将它们转换为明确的 va_list。
template < typename ...Args >
int super_vaprintf( Something x, std::va_list &aa, Args &&...a );
// Note that "aa" is passed by reference.
template < typename ...Args >
int super_printf( Something x, Args &&...a, ... )
{
std::va_list args2;
int result;
va_start( args2, XXX ); // (A)
try {
result = super_vaprintf( x, args2, std::forward<Args>(a)... );
} catch ( ... ) {
va_end( args2 ); // (1)
throw;
}
va_end( args2 ); // (2)
return result;
// Can (1) and (2) be compacted with RAII using a custom deleter lambda
// in std::unique_ptr or something? Remember that "va_end" is a macro!
}
通常的 C++ 可变参数递归剥离发生在super_vaprintf
调用中。在 (A) 行,用什么代替XXX
“a”或“a...”?如果a为空会发生什么,x会去那里吗?如果最后一个问题是真的,如果没有x ,我们会被搞砸吗?除了可变参数之外没有任何参数?(如果它是真的,我们如何条件化代码以在a为空时使用x ,否则使用a?)
...
我只是查看了我的 C++11 标准副本以获得任何帮助。似乎没有。这将促使 C++ 委员会要求回来解决这个问题,但我不确定是否有任何方法可以在没有 C++ 可变参数的情况下调用这样的函数。我错了吗; 可以进行函数调用以同时使用 C++ 和 C 可变参数吗?或者就愚蠢(模板)实例化技巧而言,混合仅对声明有用?