автоматическое объявление переменной внутри выражения условия while в c ++ - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть код, который использует оператор 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 голосов
/ 16 декабря 2018

Как насчет разделения двух условий?Основным для продолжения цикла является _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;
    }
}
...