Я чувствую, что упускаю что-то очевидное, но до сих пор не могу этого понять
Вы сделали.И это то, с чего вы на самом деле начали: "просто используйте v-версию этих функций" .Причина, по которой эти функции получили v-версию, заключалась в том, чтобы разрешить, как вы это называли, их цепочку.Так что, если вы хотите поддержать его для своей собственной функции, похожей на printf, обязательно следуйте той же практике:
void direct_v(const char * _fmt, bool _extra, va_list args){
char ca[200];
vsprintf(ca, _fmt, args);
std::cout << ca << std::endl;
}
void direct(const char * _fmt, bool _extra...){
va_list args;
va_start(args, _extra);
direct_v(_fmt, _extra, args);
va_end(args);
}
void chained(const char * _fmt...){
va_list args;
va_start(args, _fmt);
direct_v(_fmt, false, args);
va_end(args);
}
Хорошее появляющееся свойство разделения direct
, подобное тому, что вы получаете лучшее разделениепроблемы.Оболочка выполняет бит, связанный с va_list
, а v-функция заботится только о том, что нужно сделать со списком, что позволяет здесь использовать повторно.
Примечание перед редактированием: BTW, если совместимость с C действительно важна, прототипы функций нуждаются в запятой, чтобы отделить последний аргумент от многоточия.Синтаксис, который вы использовали, только C ++.