printf — передача нескольких аргументов в параметре C ++ без использования va_list

У меня есть такой формат функции:

std::string format(const char* szFormat,...)
{
std::string stringResult;
char c;

va_list args;
va_start(args, szFormat);

//we estimate the size to malloc
int nSize = vsnprintf(&c, 1, szFormat, args);

va_end(args);

char *str = (char *)malloc(sizeof(char) * (nSize + 1));

//we must make va_start again otherwize vsnprintf won't work
va_list args2;
va_start(args2, szFormat);
vsnprintf(str, nSize + 1, szFormat, args2);
va_end (args2);

std::string result(str);
free(str);

return result;
}

У меня есть функция отображения, как:

std::string display(const char* szFormat,...)
{
}

который должен вызвать format ().

Я не могу сделать va_start в функции display () и изменить сигнатуру функции формата

std::string format(const char * szFormat, va_list &arg_ptr)

потому что моя команда форматирования должна запускать va_start много раз.

(один раз для оценки длины целевой строки и один раз для создания реальной строки).

У тебя есть идея?

РЕДАКТИРОВАТЬ :

Для тех, кто хочет полностью функциональное решение благодаря Брайану:

static std::string format(const char * szFormat, va_list &arg_ptr)
{
std::string stringResult;
char c;

va_list args2;
va_copy(args2, arg_ptr);

int nSize = vsnprintf(&c, 1, szFormat, arg_ptr);
char *str = (char *)malloc(sizeof(char) * (nSize + 1));

vsnprintf(str, nSize + 1, szFormat, args2);

std::string result(str);
free(str);

return result;
}

static std::string format(const char * szFormat,...)
{
va_list args;
va_start(args, szFormat);
std::string result = format(szFormat, args);
va_end(args);
return result;
}

2

Решение

Изменить подпись format(), Затем используйте va_copy макрос, чтобы сделать копию va_list в format()так что вы можете позвонить va_start один раз на каждую копию.

2

Другие решения