Использование множества аргументов без дублирования кода - PullRequest
1 голос
/ 09 апреля 2009

Есть ли способ использовать каждый из аргументов в этой функции по очереди без дублирования кода? Например, в первый раз в цикле я хотел бы использовать R, в следующий раз я бы хотел использовать L и т. Д. Valuestruct устанавливается в том же порядке, что и аргументы, поэтому метод button будет возвращать эквивалент bool мне нужно для кнопки current согласно int i. Если есть лучший способ сделать то же самое, это тоже нормально.

int valuex=0;

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F) {

        bool value[4] = {true, false, true, false};
        bool currentbutton;

        for (int i=0; i < 12; i++) {
            currentbutton=valuestruct.button(i);

            if(currentbutton) {
                "I want to grab each argument in sequence here"=value[valuex];
                valuex++;
                if(valuex>ARRAYSIZE(value))
                    valuex=0;
            }
        }
    }

Ответы [ 6 ]

4 голосов
/ 09 апреля 2009

Если вы действительно настаиваете на этом прототипе функции (и не следуете другим рекомендациям по передаче массива или списка - что лучше), вы можете использовать что-то подобное -

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F)
{
   bool* Bools[] = { &R, &L, &D, &U, &T, &S, &B, &A, &Y, &X, &W, &E, &G, &F };

   // *Bools[i] can be used to access the ith element.

   // Print the 4th element.
   std::cout << *Bools[3];

   // Change the value of the 5th.
   *Bools[4] = true;
}

Кстати, если вам действительно не нужно менять переданные значения, вы не должны передавать их по ссылке. Передача bool по ссылке только тратит время и пространство. Это также сделало бы код здесь немного менее загруженным.

3 голосов
/ 09 апреля 2009

Или битовое поле ? Быстрая и грязная версия:

int field = FLAG_R | FLAG_L

void SetValue(int fields) {
    for (int i = 0; i < FLAG_COUNT; i++) {
        if (fields & (1 << i)) {
            // Flag #i is set
        }
    }
}

EDIT

Кстати, передача bools в качестве ссылки бесполезна, если вы не меняете значение. Указатель, используемый для ссылки, возможно, длиннее, чем тип, содержащий сам bool.

3 голосов
/ 09 апреля 2009

Рассматривали ли вы использование массива bool? :) Коллекция определенно способ идти. Если вам нужно сохранить метаданные для фильтрации или получения определенных значений, рассмотрите возможность использования карты.

1 голос
/ 09 апреля 2009

Я бы добавил это к ответу шестиугольника, но пока не могу редактировать сообщения.

int valuex=0;

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A
             ,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F) 
{
    bool* bools[] = { &R, &L, &D, &U, &T, &S, &B, &A, &Y, &X, &W, &E, &G, &F };
    bool value[4] = {true, false, true, false};
    bool currentbutton;

    for (int i=0; i<12 && i < ARRAYSIZE(bools); i++) {
            currentbutton=valuestruct.button(i);

            if(currentbutton) {
                    *bools[i]=value[valuex];
                    valuex++;
                    if(valuex>ARRAYSIZE(value))
                            valuex=0;
            }
    }
}

Хотя я не понимаю, откуда, по-вашему, вы будете читать только значения bool, вы не можете установить все из них.

1 голос
/ 09 апреля 2009

Вы можете использовать переменную поддержку аргументов, так как у вас есть фиксированное количество аргументов, которые вы знаете, сколько нужно зациклить. IIRC фактически не требует, чтобы функция имела переменные аргументы.

va_list args;                                                                                                     
va_start(args,R);
// your code here...
va_end();

Простите, если это не так ... прошло несколько лет с тех пор, как я активно кодировал C.

0 голосов
/ 09 апреля 2009

Вы можете поместить аргументы в массив и вместо этого передать массив. В зависимости от кода вызова это может привести к уменьшению кода.

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