我有一个结构,其名称类似
git commit --allow-empty
我需要的是一个将输入与每个输入进行比较的循环。
git push heroku master
现在我有一长串if和else。不幸的是,我无法更改结构。 如果较长的if / elses字符串是最有效的方式(性能不是代码看起来的好),那么就只能保持这种状态。
我基本上想要一个循环来更改我当前正在比较的变量名称,以使代码更简洁,希望更快。
答案 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';
}