C++ 在不重复代码的情况下使用多个参数

C++ 在不重复代码的情况下使用多个参数,c++,loops,arguments,C++,Loops,Arguments,有没有一种方法可以在不重复代码的情况下按顺序使用此函数中的每个参数?例如,第一次循环我想使用R,下一次我想使用L,等等。valuestruct的设置顺序与参数相同,因此button方法将根据int I返回currentbutton所需的等效bool。如果有更好的方法来完成同样的事情也没关系 int valuex=0; void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,boo

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

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;
            }
        }
    }
int valuex=0;
无效设定值(布尔与R、布尔与L、布尔与D、布尔与U、布尔与T、布尔与S、布尔与B、布尔与A、布尔与Y、布尔与X、布尔与W、布尔与E、布尔与G、布尔与F){
布尔值[4]={true,false,true,false};
布尔电流按钮;
对于(int i=0;i<12;i++){
currentbutton=valuestruct.button(i);
如果(当前按钮){
“我想在这里按顺序获取每个参数”=value[valuex];
valuex++;
如果(valuex>ARRAYSIZE(值))
valuex=0;
}
}
}

您考虑过使用布尔数组吗?:)收藏绝对是最好的选择。如果您需要保留用于过滤或获取某些值的元数据,请考虑使用MAP。

是否考虑使用BoOL数组?收藏绝对是最好的选择。如果需要保留用于过滤或获取某些值的元数据,请考虑使用MAP。

< P>可以将参数放在数组中,然后传递数组。根据调用代码的不同,这可能会导致更少的代码。

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

您可以使用变量参数支持,因为您有固定数量的参数,您知道要循环多少。IIRC实际上并不要求函数具有变量参数

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

原谅我,如果这是错的。。。我已经有好几年没有主动编写C了。

您可以使用变量参数支持,因为您有固定数量的参数,您知道要循环多少。IIRC实际上并不要求函数具有变量参数

va_list args;                                                                                                     
va_start(args,R);
// your code here...
va_end();
原谅我,如果这是错的。。。我已经有好几年没有主动编码C了。

还是a?快速脏版:

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
        }
    }
}
int field=FLAG_R|FLAG_L
无效设置值(整型字段){
对于(int i=0;i
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
        }
    }
}
int field=FLAG_R|FLAG_L
无效设置值(整型字段){
对于(int i=0;i如果(fields&(1如果你真的坚持这个函数原型(并且不遵循这里传递数组或列表的其他建议,哪一个更好),你可以使用类似的东西-

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;
}
void设置值(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]可用于访问第i个元素。
//打印第四个元素。

如果您真的坚持使用这个函数原型(并且不遵循这里传递数组或列表的其他建议,哪一个更好),您可以使用类似的方法-

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;
}
void设置值(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]可用于访问第i个元素。
//打印第四个元素。

std::cout我想将此添加到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;
            }
    }
}
int valuex=0;
无效设定值(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};
布尔值[4]={true,false,true,false};
布尔电流按钮;
对于(int i=0;i数组大小(值))
valuex=0;
}
}
}

虽然我不明白人们认为你只会读取布尔值的地方,但你可能不会设置所有布尔值。

我会将此添加到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;
            }
    }
}
int valuex=0;
无效设定值(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};
布尔值[4]={true,false,true,false};
布尔电流按钮;
对于(int i=0;i数组大小(值))
valuex=0;
}
}
}

虽然我不知道在哪里,你只会读取布尔值,但你可能不设置所有的。

为什么它被否决了?很可能也会用固定的参数来工作——它们和变量变量一样,位于栈中。C++ ValARGS宏和C++引用不混合。“警告:不能接收非POD类型的对象‘Boo&’…’;在运行时调用将中止”得到它,没有注意C++引用。对于纯C,它应该工作。OP甚至需要变量作为引用吗?我不这么认为,因为调用被称为“设置值”(另一个评论基本上也指出了这一点)。。这在没有引用的情况下是可行的。+1在我的书中。每个参数依次将是左值,替换字符串“我想按顺序获取每个参数“所以它们必须是引用。为什么它被否决了?很可能也会用固定的参数来工作。它们以与变量参数相同的方式位于栈中。C ValARGS宏和C++引用不混合。”警告:不能接收非POD类型的对象“BoOL和‘通过’…”;在运行时调用将中止。明白了,没有注意C++引用。对于纯C,它应该工作。OP甚至需要变量作为参考吗?我不知道。