为了绕过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并实现一个和两个参数的always-inline模板,这将有效地增加所需代码的数量。
编辑:也许一种方式转换std::tuple
args
是成为一个va_list将在这里工作?
是不是定义了'va_list'实现的实现?所以至少没有可移植的方式来转换它,对吧?另外,'boost :: format'可以替代。 – pmr
要明确,'args'根本不是'std :: tuple'。这是它自己独特的实体,我忘了一个名字。 'args ...'基本上扩展到'arg0,arg1,arg2,...,argN';换句话说,如果'vsprintf_l'接受了可变数量的参数,而不是单个'va_list'对象,那么你所做的就会起作用。 –