Передача элементов std :: vector в вариативную функцию

Я использую 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 (), то есть как стек.

  1. Возможно ли это?
  2. В качестве альтернативы, можно ли поместить значения векторных элементов в реальный стек с помощью некоторой встроенной магии ассемблера, вызвать функцию f () и очистить стек после этого?

Наконец, вещи, которые меня не волнуют:

  1. Код может быть непереносимым. Хорошо, меня просто интересует gcc.
  2. Могут быть и другие подходы, включающие взлом препроцессора.
  3. Использование вариативных функций для форматирования, таких как printf (), не рекомендуется для C ++.
  4. Использование вариативных шаблонных функций.
8
задан user1142580 14 February 2012 в 12:31
поделиться