爲了繞過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'對象,那麼你所做的就會起作用。 –