Как правило, использование функции вариационного шаблона С++ 11 с функциями требует, чтобы аргументы функции на основе вариации были последними в списке аргументов функции. Есть одно исключение; они являются следующими последними аргументами, если существуют вариативные аргументы C-уровня, которые должны быть мертвыми последними.
template < typename ...Args >
int super_printf( Something x, Args &&...a, ... );
Я иногда случайно думаю о С++, и я задавался вопросом, как такая функция может быть реализована. Сначала я подумал об обычном рекурсивном пилинге аргументов из a, затем я вспомнил, что varargs уровня C не каскадируются. Мне нужно сразу же перейти к окончательному va_list.
template < typename ...Args >
int super_vaprintf( Something x, std::va_list &aa, Args &&...a );
// Note that "aa" is passed by reference.
template < typename ...Args >
int super_printf( Something x, Args &&...a, ... )
{
std::va_list args2;
int result;
va_start( args2, XXX ); // (A)
try {
result = super_vaprintf( x, args2, std::forward<Args>(a)... );
} catch ( ... ) {
va_end( args2 ); // (1)
throw;
}
va_end( args2 ); // (2)
return result;
// Can (1) and (2) be compacted with RAII using a custom deleter lambda
// in std::unique_ptr or something? Remember that "va_end" is a macro!
}
Обычный вызов рекурсивного пилинга С++ происходит в вызове super_vaprintf
. В строке (A), что происходит вместо XXX
, "a" или "a..."? Что произойдет, если a пусто, вместо этого x отправляется туда? Если этот последний вопрос верен, мы вкручиваем, если нет x; что нет никаких аргументов, кроме вариационных? (И если это правда, как мы условно кодируем код для использования x, когда a пуст, а в противном случае?)
...
Я просто посмотрел на свою копию стандарта С++ 11 для любой помощи здесь. Кажется, их нет. Это вызовет запрос для комитета С++ вернуться, чтобы исправить это, но я не уверен, что какой-либо способ такой функции можно было бы вызывать без использования всех переменных С++ varargs. Я ошибаюсь; может ли вызов функции использоваться как С++, так и C varargs? Или смешение полезно только для объявлений в терминах трюков с помощью Stupid (Template)?