Я чувствую, что упускаю что-то очевидное, но до сих пор не могу понять это
blockquote>Вы сделали. И это то, с чего вы на самом деле начали: «просто используйте 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-функция заботится только о том, что нужно сделать со списком, что позволяет здесь использовать повторно.
Примечание перед редактированием: Кстати, если совместимость с C действительно важна, прототипы функций нуждаются в запятой, чтобы отделить последний аргумент от многоточия. Синтаксис, который вы использовали, - только C ++.
Я думаю, что большинство разработчиков, использующих c# 4.0, будет использовать их сам включенный особенно при создании библиотеки, которую Вы планируете подвергнуть любому. Это может сделать Ваш код более подробным в областях, но преимущества, которые это имеет, должны перевесить строки кода и проведенное время.
Честно говоря, я понятия не имел, чем они были, пока я не видел Вашего вопроса. Я не вижу применимости для своей организации, таким образом, мы, вероятно, не будем использовать их.
Что Вы имеете в виду, смерть Spec#? Это - следующая эволюция Spec#.
И, да, я планирую использовать их.