Я использую gcc 4.6. Предположим, что есть вектор v параметров, который я должен передать вариативной функции f (const char * format, ...).
Один из способов сделать это:
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 (), то есть как стек.
Наконец, вещи, которые меня не волнуют: