Eu também queria embrulhar printf e encontrei uma resposta útil aqui:
Como passar um número variável de argumentos para printf / sprintf
Eu não estava nem um pouco interessado em desempenho (tenho certeza que este pedaço de código pode ser melhorado de várias maneiras, fique à vontade para fazer isso :)), isso é apenas para depuração geral, então fiz o seguinte:
//Helper function
std::string osprintf(const char *fmt, ...)
{
va_list args;
char buf[1000];
va_start(args, fmt);
vsnprintf(buf, sizeof(buf), fmt, args );
va_end(args);
return buf;
}
que eu então posso usar assim
Point2d p;
cout << osprintf("Point2d: (%3i, %3i)", p.x, p.y);
instead of for example:
cout << "Point2d: ( " << setw(3) << p.x << ", " << p.y << " )";
Os ostreams C ++ são bonitos em alguns aspectos, mas praticamente se tornam horríveis se você quiser imprimir algo assim com algumas pequenas strings como parênteses, dois pontos e vírgulas inseridos entre os números.