在C ++中的while条件表达式内自动声明变量

时间:2018-12-16 12:26:28

标签: c++ c++11 c++17

我有一个使用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) {...}样式声明?也许有一些新功能可以做到这一点?

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;
    }
}