C++循环和比较编号变量

Cri*_*era 2 c++

我有一个具有类似命名变量的结构,例如

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的长字符串是最有效的方式(性能不是代码看起来有多好),那么我只是保持这样.

我基本上想要一个更改我当前正在比较的变量名称的循环,以使代码更少杂乱,并希望更快.

Sto*_*ica 8

好吧,既然你不能改变结构,你可以避免一些重复,并通过使用指向字段的指针数组来解决这个问题:

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)

...可以成功优化到展开的循环,相当于一系列分支.