有没有办法按顺序使用此函数中的每个参数而不重复代码?例如,第一次通过循环我想使用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;
}
}
}
答案 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)
您可以将参数放入数组并改为传递数组。根据调用代码的不同,这可能会导致代码减少。