11

新しい範囲ベースの for ループは読みやすさを向上させ、非常に使いやすくなっています。ただし、次の点を考慮してください。

map<Foo,Bar> FooAndAssociatedBars;

for (auto& FooAndAssociatedBar : FooAndAssociatedBars) {
    FooAndAssociatedBar.first.doSth();
    FooAndAssociatedBar.second.doSomeOtherThing();
}

詳細かもしれませんが、次のようなことができればもっと読みやすいと思います。

for ( (auto& foo, auto& bar) : FooAndAssociatedBars) {
    foo.doSth();
    bar.doSomeOtherThing();
}

同等の構文を知っていますか?

編集: 朗報: 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

この可読性の問題を解決する

4

3 に答える 3

1

良い考えではありません。遅かれ早かれ、 a に対して同じことが必要になりstd::tuple、コンパイラは で自動的に使用できるようになるはずstd::get<>ですtuple。私の意見では、あなたのアプローチは現時点でのみあなたを喜ばせており、このアプローチには問題があるでしょう (そのように実装されていると仮定してください)。

標準委員会は、深い考慮を払って範囲ベースの for ループを設計しました。foreach他の言語のループよりもはるかに優れており、はるかに短いです。と組み合わせると完成auto&です!

于 2013-03-20T15:33:02.017 に答える
0

そしてもちろん、ラムダを使用する可能性は常にあります。

std::map<int, const char*> m { { 4, "hello" }, { 11, "c++" } };
convenient_for_each(m, [](int a, const char* b) {
    std::cout << b << a << std::endl;
  });
convenient_for_each(m, [](std::pair<int, const char> p) {
    std::cout << p.first << p.second << std::endl;
  });

またはマクロとしてラップ (非推奨)

FOREACH((int a, const char* b), m, std::cout << a << b << std::endl);
FOREACH((std::pair<int, const char*> p), m, std::cout << p.first << p.second << std::endl);

( LWS でのハックなサンプル実装)

Auto は機能しませんが、まだポリモーフィック ラムダを待っています。私のアプローチは、理論的にはタプルも処理できます。

于 2013-03-20T15:33:01.377 に答える