我有一个使用while语句的代码。内 条件表达式我进行查找。同时,条件表达式检查返回值:
#include <map>
struct a {
a *up;
std::map<int,int> tbl;
};
void p(a *_a, int id) {
decltype(_a->tbl)::iterator i;
while (_a && (i = _a->tbl.find(id)) != _a->tbl.end()) {
i->second += 1;
_a = _a->up;
}
}
int main(int arc, char **argv) {
a _a1{0,{{0,10},{1,10}}};
a _a0{&_a1,{{2,11},{3,11}}};
p(&_a0, 0);
return 0;
}
但是,我想摆脱i
的显式声明。我想使用auto
。用伪代码:
...
void p(a *_a, int id) {
while (_a && ((auto i = _a->tbl.find(id))) != _a->tbl.end()) {
i->second += 1;
_a = _a->up;
}
}
...
在c ++ 11/14/17中是否存在一个在表达式内部 中支持这种声明的构造?不仅while(auto i = 1) {...}
样式声明?也许有一些新功能可以做到这一点?
答案 0 :(得分:3)
如何将这两个条件分开?继续循环的主要对象是_a
,次要对象(可能一直为真)是_a->tbl.find(id) != _a->tbl.end()
。返回其否定:
void p(a *_a, int id) {
while (_a) {
auto i = _a->tbl.find(id);
if (i == _a->tbl.end()) {
return;
}
i->second += 1;
_a = _a->up;
}
}