У меня есть такой формат функции:
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;
}
Изменить подпись format()
, Затем используйте va_copy
макрос, чтобы сделать копию va_list
в format()
так что вы можете позвонить va_start
один раз на каждую копию.