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

最佳答案

如何将这两个条件分开?继续循环的主要对象是_a,次要对象(可能始终为true)是_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;
    }
}

关于c++ - 在C++中的while条件表达式内自动声明变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53802102/

10-11 22:24
查看更多