С++ и функции с переменным количеством агрументов

178
26 ноября 2016, 19:08

Допустим у нас есть функция

void foo(int a, ...)

и функция

void bar(int a, ...)

Вопрос: как в функции bar() можно вызвать функцию foo() так, что бы добавить пару своих аргументов и передать все которые ей пришли?

Например: вызываем bar(1,2,3,4,5) и нужно что бы в функции bar было вызвано foo(1, 10, 2, 3, 4, 5, 20).

P. S. Функции не обязательно должны принимать int.

Например

typedef void (*EndFunction)(...);
void endFunction(double a, double b, int c, void* d) {
}
EndFunction someEndFunction = (EndFunction) endFunction;
void recieverFunction(SomeParamStack* stack, ...) {
    if(stack->empty()) someEndFunction(/* вот тут нужно поместить список аргументов */);
    else switch (stack->getNextType()) {
        case(ST_INT) : {
            recieverFunction(stack,/* аргументов */,stack->getInt(),);
            break;
        }
        case(ST_DOUBLE) : {
            recieverFunction(stack,/* аргументов */, stack->getDouble());
            break;
        }
        case(ST_POINTER) : {
            recieverFunction(stack,/* аргументов */, stack->getPointer());
            break;
        }
    }
}


int main ( int argc, char **argv ) {
    SomeParamStack stack;
    stack->pushPointer(0);
    stack->pushInt(3);
    stack->pushDouble(2.2);
    stack->pushDouble(1.1);
    recieverFunction(stack);
}
Answer 1

Сделать функцию, принимающую список параметров - по аналогии с vprintf - не годится?

void foo(int count, va_list vlist)
{
    if (count == 0) return;
    va_list ap;
    va_copy(ap,vlist);
    printf("Count = %d, value = %d\n",count,va_arg(ap,int));
    foo(count-1,ap);
    va_end(ap);
};

void foo(int count, ...)
{
    va_list ap;
    va_start(ap,count);
    foo(count,ap);
    va_end(ap);
}

int main(int argc, const char * argv[])
{
     foo(5,1,2,3,4,5);
}
Answer 2
void foo(double a,...) //Так объявляется функция с заранее неизвестным числом параметров
{
  double *P=&a; //Взятие адреса у первого параметра
  double sum=0; //Инициализация значения суммы в ноль
  while (*P) //Пока встречаются параметры и параметр не равен 0
   {
     sum=sum+(*P);//Прибавляем к сумме то что взяли по адресу P 
     P++; //Адресная арифметика. Смена текущего адреса на следующий
   }

  cout<<sum<<endl; //Вывод результата на экран
}
void bar(double a,...) 
{
  double *P=&a; 
  double i=0, fooi=0;;
 double[] fooArgs = new double[] { 1, 3, 5, 7, 9 };
  double[] *resArgs = new double[500];
  foo
  while (*P) 
   {
     sum=sum+(*P);//Адресная арифметика. Смена текущего адреса на следующий
     resArgs[++i] = fooArgs[++fooi];
     resArgs[++i] = (*P);
   }
   foo(resArgs);
}
READ ALSO
Функции WinExec, ShellExecute, CreateProcess, system(&ldquo;&hellip;&rdquo;) не запускают exe приложение!

Функции WinExec, ShellExecute, CreateProcess, system(“…”) не запускают exe приложение!

В лаунчере на С++ должны поочерёдно запускаться несколько других приложенийКомадны запуска для всех приложений одинаковые - например,

231
Среднее арифметическое набора чисел [закрыто]

Среднее арифметическое набора чисел [закрыто]

Данные об успешности студентов записано в N строках символов, каждый из которых имеет следующую структуру: фамилия и др, № зачетной книжки,...

159
Рекурсивный спуск/возврат С++

Рекурсивный спуск/возврат С++

Не могли бы объяснить отличие выполнение кода на рекурсивном спуске и возврате (с примером)? Как вообще определить, что программа выполняется...

541
Книги и другая литература по С++

Книги и другая литература по С++

В этом вопросе собирается литература по языку C++

448