2

私は Visual Studio 2010 を使用しています。私が使用したい機能の 1 つは、VS2010 には含まれていませんが、VS2012 に含まれているのは、範囲ベースの for ループです。

VS2012 では、次のようなきちんとした非常にきちんとした for ループを実行できます。

for( auto& it: myElements )
    it->something();

これまでのところ、VS2010 で得られる最も近いものは次の構文です。

for( auto it = myElements.begin(), end = myElements.end(); it != end; it++ )
    it->something();

関連する質問をいくつか読んだところ、boost\foreach を使用して次のマクロにアクセスできることがわかりました。

BOOST_FOREACH( auto it, myElements ){
    it.something();
}

このメソッドに関する私の問題は、ポインタではなくコピー(または同様のもの)を提供することです。ここで私は混乱します。foreach リファレンスには次のように書かれています。

動的な割り当てを行わず、仮想関数の呼び出しや関数ポインターを介した呼び出しを行わず、コンパイラのオプティマイザーに対して透過的でない呼び出しも行いません。

どういう意味ですか?コピペじゃないの?

BOOST_FOREACH からポインタを取得するにはどうすればよいですか? または、他のブースト機能を使用する必要がありますか?

ここの他の質問でこの構文を見ました:

BOOST_FOREACH( auto& it, myElements ){
    it->something();
}

ただし、これはコンパイルされず、エディターでエラーがスローされます。これの何が問題なのですか?ここで他の多くの質問で有効なコードだとわかったのはなぜですか?

VS2010 には、範囲ベースの for ループのためのきちんとした解決策はありますか? (ブースト使用含む)

4

2 に答える 2

2

主な質問は、ポインタのコンテナがありますか? VS2012 でも、for(auto& it: myElements) it->something();(スマート) ポインターのコンテナーでのみ機能します。は&それitが参照であることを示し、->はそれがポインタであることを示します。これは矛盾ではありません。ポインタへの参照を持つことができます。

しかし、とにかくポインターが必要な理由は何ですか? 参照ははるかに慣用的です。

于 2013-02-11T08:36:15.340 に答える
1

これは間違っています:

VS2012 では、次のようなきちんとした非常にきちんとした for ループを実行できます。

for( auto& it: myElements )
    it->something();

範囲ベースのループは、オブジェクトへの参照を返します。

for(auto& element: myElements)
    element.something();

編集

最初の構文は、コンテナーに格納されているオブジェクトがポインターであるか、operator*スマート ポインターなどのオーバーロードされたクラスのオブジェクトである場合に有効です。

于 2013-02-11T08:35:44.220 に答える