Как передать список аргументов другой функции в 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, вы найдете множество примеров для этого, например _3 _ / _ 4_, _5 _ / _ 6_ (но не _7 _ / _ 8_!).

person Kerrek SB    schedule 08.12.2013