其中一种方法是:
void VectorToVarArgs(vector<int> &v)
{
switch(v.size())
{
case 1: f("%i", v[0]);
case 2: f("%i %i", v[0], v[1]);
case 3: f("%i %i %i", v[0], v[1], v[2]);
case 4: f("%i %i %i %i", v[0], v[1], v[2], v[3]);
// etc...
default:
break;
}
}
// where function f is
void f(const char* format, ...)
{
va_list args;
va_start (args, format);
vprintf (format, args);
va_end (args);
}
问题显然是它不支持向量v中任意数量的项。 然而,我相信我已经理解了va_lists的工作原理, 即通过从堆栈中读取参数,从“...”之前的最后一个命名参数的地址开始, 现在我认为应该可以将向量项目值复制到内存块(例如myMemBlock)中 并将其地址作为'format'后面的第二个参数传递。 显然,这需要使myMemBlock像堆栈一样被f()正确地结构化。
- 这样的事情可行吗?
- 或者,是否可能通过一些内联汇编器魔法将向量项目值推到实际堆栈上, 调用函数f()并在清理完堆栈后?
最后,我不关心的事情:
- 代码可能不可移植。好吧,我只对gcc感兴趣。
- 可能会涉及利用预处理器进行hackery的其他方法。
- 不鼓励使用类似于printf()的变参函数来进行格式化的用法。
- 不鼓励使用变参模板函数。