使用许多参数而不复制代码

时间:2009-04-09 07:12:16

标签: c++ loops arguments

有没有办法按顺序使用此函数中的每个参数而不重复代码?例如,第一次通过循环我想使用R,下次我想使用L等,valuestruct的设置顺序与参数相同,因此button方法将返回等效的bool我根据int i需要currentbutton。如果有更好的方法来完成同样的事情也可以。

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 个答案:

答案 0 :(得分:4)

如果你真的坚持这个函数原型(而不是遵循传递数组或列表的其他建议 - 哪个更好),你可以使用类似的东西 -

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只会浪费时间和空间。这也会使这里的代码变得更加混乱。

答案 1 :(得分:3)

您是否考虑过使用bool阵列? :)一个集合绝对是要走的路。如果您需要保留元数据以进行过滤或获取某些值,请考虑使用Map。

答案 2 :(得分:3)

bit field?快速和肮脏的版本:

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
        }
    }
}

修改

顺便说一下,如果你不改变价值,那么传递bools作为参考是没用的。用于引用的指针可能比保存bool本身的类型长。

答案 3 :(得分:1)

你可以使用变量参数支持,因为你知道有多少个参数需要循环。 IIRC实际上并不要求该函数具有可变参数。

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

请原谅我,如果这是基础......自从我积极编码C以来已经有几年了。

答案 4 :(得分:1)

我将此添加到hexagon的答案中,但我还无法编辑帖子。

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的值,但你可能不会设置所有这些值。

答案 5 :(得分:0)

您可以将参数放入数组并改为传递数组。根据调用代码的不同,这可能会导致代码减少。