C++ 11基于范围和map:可读性

Bér*_*ger 11 c++ foreach dictionary code-readability c++11

新的基于范围的for循环确实提高了可读性,并且非常易于使用.但是,请考虑以下事项:

map<Foo,Bar> FooAndAssociatedBars;

for (auto& FooAndAssociatedBar : FooAndAssociatedBars) {
    FooAndAssociatedBar.first.doSth();
    FooAndAssociatedBar.second.doSomeOtherThing();
}
Run Code Online (Sandbox Code Playgroud)

它可能是一个细节,但我发现如果我能做到这样的话会更具可读性:

for ( (auto& foo, auto& bar) : FooAndAssociatedBars) {
    foo.doSth();
    bar.doSomeOtherThing();
}
Run Code Online (Sandbox Code Playgroud)

你知道一个等价的语法吗?

编辑: 好消息:C++ 17有一个解决这个问题的提议,称为结构化绑定(见1).在C++ 17中,您应该能够编写:

tuple<T1,T2,T3> f(/*...*/) {
    /*...*/ 
    return {a,b,c};
}
auto [x,y,z] = f(); // x has type T1, y has type T2, z has type T3
Run Code Online (Sandbox Code Playgroud)

这解决了这个可读性问题

Som*_*ude 10

没有你想要的东西.最接近的是在循环内声明变量:

for (auto& FooAndAssociatedBar : FooAndAssociatedBars) {
    auto& foo = FooAndAssociatedBar.first;
    auto& bar = FooAndAssociatedBar.second;

    // ...
}
Run Code Online (Sandbox Code Playgroud)