我有一个具有类似命名变量的结构,例如
char c1;
char c2;
char c3;
char c4;
char c5;
char c6;
char c7;
char c8;
Run Code Online (Sandbox Code Playgroud)
我需要的是一个循环,将输入与每个输入进行比较.
//Something Like
for(int i = 1; i <= 8; i++) {
if(compared == foo->c(i)) {
return compared;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有一长串if和elses.不幸的是,我无法改变结构.如果if/elses的长字符串是最有效的方式(性能不是代码看起来有多好),那么我只是保持这样.
我基本上想要一个更改我当前正在比较的变量名称的循环,以使代码更少杂乱,并希望更快.
好吧,既然你不能改变结构,你可以避免一些重复,并通过使用指向字段的指针数组来解决这个问题:
char const * c_ptr[] = {
&foo->c1, &foo->c2, &foo->c3, /* ... */, &foo->c8
};
Run Code Online (Sandbox Code Playgroud)
让你的循环:
for(int i = 0; i < 8; ++i) {
if(compared == *c_ptr[i]) {
return compared;
}
}
Run Code Online (Sandbox Code Playgroud)
但实际上,如果可能的话,尽量推动改变结构.
考虑到这是C++,另一种选择是使用指向成员的指针.它具有制作阵列的额外好处constexpr(完全在编译时知道).例如,这段代码......
static constexpr char Foo:: *c_ptr [] = {
&Foo::c1, &Foo::c2, &Foo::c3, &Foo::c4,
&Foo::c5, &Foo::c6, &Foo::c7, &Foo::c8
};
for(int i = 0; i < 8; ++i) {
if(compared == foo->*c_ptr[i]) {
return compared;
}
}
Run Code Online (Sandbox Code Playgroud)
...可以成功优化到展开的循环,相当于一系列分支.