C ++ Как зациклить динамические аргументы из функции? - PullRequest
0 голосов
/ 11 августа 2010

Мне нужно зациклить все динамические аргументы, которые я дал своей функции, как?

Я имею в виду такой код:

void something(int setting1, int setting2, ...){
   // loop somehow all the ... arguments and use setting1-2 values in that loop
}

setting1 и setting2 не являются частьюдинамический список аргументов.

Ответы [ 4 ]

2 голосов
/ 11 августа 2010

Используйте функции va_. Вот пример:

void PrintFloats ( int amount, ...)
{
    int i;
    double val;
    printf ("Floats passed: ");
    va_list vl;
    va_start(vl,amount);
    for (i=0;i<amount;i++)
    {
        val=va_arg(vl,double);
        printf ("\t%.2f",val);
    }
    va_end(vl);
    printf ("\n");
}

Ваши другие аргументы должны указывать, сколько есть других аргументов. printf, например, использует проценты в строке формата, чтобы сделать это. Мой пример использует первый аргумент.

И чтобы вы не подумали, что этот тип аргументации - это колени пчел, обязательно прочитайте Варарги плохие, хорошо .

1 голос
/ 11 августа 2010

Как это:


#include <stdarg.h>

void Foo(int s1, int count, ...)
{
        va_list args;

        va_start(args, count);

        if (count > 0) {
            // Do something with the first variable, assuming it's std::string...
            std::string v1(va_arg(args, std::string));

            for (unsigned int i = 0; i < count - 1; ++i)
                    std::cout << va_arg(args, std::string) << "|";
        }

        va_end(args);
}
1 голос
/ 11 августа 2010

Эта статья MSDN содержит объяснение и разумный пример.

Примечание: весь бизнес va_arg не очень безопасен, и, как другие предложили, если все эти аргументы имеюттого же типа, просто поместите их все в контейнер и передайте его вместо этого.

например:

void func(int arg1, int arg2, std::vector<float> &myFloats)
{
    // myFloats can be used here, and you know how many floats there are
    // by calling myFloats.size()
} 
0 голосов
/ 11 августа 2010

Вы можете извлечь переменные аргументы в структуру данных (список, массив и т. Д.) И добавить setting1 / setting2 к этой структуре.

Тогда просто переберите все элементы структуры:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...