Пытаясь обойти невыполненные всегда встроенные вариадические функции GCC в libc ++, я подумал, что, возможно, мог бы обернуть вариадические функции (например, snprintf, точнее, вариант * _l) в шаблоне вариадий, чтобы добиться аналогичного эффекта. Инстанцирование заполняло бы переменные функции variadic, позволяя функции быть аккуратно встроенной. Проблема в том, что я не знаю в первую очередь о написании вариационных шаблонов и, конечно, не знаю, как превратить аргументы шаблона в отдельные аргументы.
Код, который я хочу заменить, имеет вид:
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*}
. Если нет никакого способа, мне придется довериться Говарду и реализовать шаблоны с одним и двумя аргументами, всегда встроенные, что эффективно удвоит объем необходимого кода.
РЕДАКТИРОВАТЬ: возможно, будет работать способ преобразования std::tuple
, который args
в va_list, здесь?