为了绕过 GCC 在 libc++ 中未实现的始终内联可变参数函数,我想我可以将可变参数函数(如 snprintf,更准确地说是 *_l 变体)包装在可变参数模板中以实现类似的效果。实例化将填充可变参数函数的可变参数,从而使函数可以很好地内联。问题是,我不知道编写可变参数模板的第一件事,当然也不知道如何将模板参数转换为单独的参数。
我要替换的代码是以下形式:
int __sprintf_l(char *__s, locale_t __l, const char *__format, ...) {
va_list __va;
va_start(__va, __format);
int __res = vsprintf_l(__s, __l, __format, __va);
va_end(__va);
return __res;
}
我想用以下形式替换它:
template<typename... Args>
int __sprintf_l(char *__s, locale_t __l, const char *__format, Args... args) {
int __res = vsprintf_l(__s, __l, __format, args...);
return __res;
}
这不起作用,因为扩展后args...
无法转换type
为va_list {aka char*}
. 如果没有办法,我将不得不信任 Howard 并实现一个和两个参数的始终内联模板,这将有效地使所需代码量翻倍。
编辑:也许一种将其转换std::tuple
为args
va_list 的方法可以在这里工作?