Как мога да предам списък с аргументи на друга функция в c++?

Имам проблем с аргументите на функцията. Имам функция A, която извиква функция B. Какво трябва да напиша вместо ??? за архивиране, че функция A предава всички аргументи на функция B?

#include <iostream>
#include <stdarg.h>

void functionA(int a, ...);
void functionB(int a, ...);

int main()
{
    functionA(2, 5, 13);

    return 0;
}

void functionA(int a, ...)
{
    functionB(a, ??? );
}

void functionB(int a, ...)
{   
    va_list params;
    va_start(params, a);
    for(int i = 0; i<a; i++)
    {
        std::cout << va_arg(params, int) << std::endl;
    }
    va_end(params);
}

person Felix    schedule 08.12.2013    source източник
comment
Не използвайте променлив брой аргументи. Това е глупава идея и не е безопасна за тип   -  person Ed Heal    schedule 08.12.2013
comment
Защо искаш да направиш спагети?   -  person Fiddling Bits    schedule 08.12.2013
comment
Може да искате да потърсите различни шаблони. Те поне ще ви позволят да направите това малко по-чисто (напр. без да разрушавате безопасността на типа).   -  person Jerry Coffin    schedule 08.12.2013


Отговори (3)


Не мисля, че можеш да го направиш с .... Ако пренапишете functionB, за да вземете va_list, както прави vprintf, това трябва да работи.

person Ben Navetta    schedule 08.12.2013

Трябва да направите две функции, едната приемаща променлив брой аргументи, а другата приемаща va_list.

void vunctionB(int a, va_list va)
{
    ...
}

void functionB(int a, ...)
{
    va_list va;
    va_start(va, a);
    functionB(a, va);
    va_end(va);
}

Може да има и други възможни решения, като например използването на променливи шаблони в C++11.

person Some programmer dude    schedule 08.12.2013

Трябва да проектирате две версии на вашата функция, една с валисти и една с променливи аргументи:

void vfunctionA(int a, va_list ap)
{
    // real logic
}

void functionA(int a, ...)
{
    va_list ap;
    va_start(ap, a);
    vfunctionA(a, ap);
    va_end(ap);
}

// same for functionB

Сега можете лесно да приложите една функция по отношение на друга:

double vrandom(int x, va_list ap)
{
    return vfunctionX(x, ap);
}

Ако проверите стандартната библиотека или библиотеката Posix, ще намерите много примери за това, напр. printf/vprintf, execl/execv (но не fork/vfork!).

person Kerrek SB    schedule 08.12.2013