C ++循环并比较编号的变量

时间:2018-11-19 14:57:38

标签: c++

我有一个结构,其名称类似

git commit --allow-empty

我需要的是一个将输入与每个输入进行比较的循环。

git push heroku master

现在我有一长串if和else。不幸的是,我无法更改结构。 如果较长的if / elses字符串是最有效的方式(性能不是代码看起来的好),那么就只能保持这种状态。

我基本上想要一个循环来更改我当前正在比较的变量名称,以使代码更简洁,希望更快。

2 个答案:

答案 0 :(得分:8)

好吧,由于您无法更改结构,因此可以避免重复,并通过使用指向字段的指针数组来解决要求:

char const * c_ptr[] = {
  &foo->c1, &foo->c2, &foo->c3, /* ... */, &foo->c8
};

让您进入循环:

for(int i = 0; i < 8; ++i) {
    if(compared == *c_ptr[i]) {
        return compared;
    }
}

但是实际上,如果可能的话,请尝试推动更改结构。


给定这是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;
    }
}

...可以successfully optimized展开循环,等效于一系列分支。

答案 1 :(得分:0)

您可以将char作为模板参数使用std::reference_wrapper

然后您的遗嘱代码将类似于this

#include <functional>

using charRef = std::reference_wrapper<char>;
struct Foo {
    char c1, c2, c3, c4, c5, c6, c7, c8;
};

char processFoo(Foo& f, char compared) {    
    charRef CR[] = {f.c1, f.c2, f.c3, f.c4, f.c5, f.c6, f.c7, f.c8};
    for(int i = 0; i < 8; ++i) {
        if(compared == CR[i]) {
            return compared;
        }
    }
    return '\0';
}