2017-06-06 15 views
12

私は簡単にこれが印刷さ要素の修正にinitializer-listループを使用する方法?

std::list<int> foo, bar, baz; 

int main() 
{ 
    foo.push_back(3); 
    foo.push_back(2); 
    bar.push_back(1); 
    for (auto &x : {foo, bar, baz}) { 
    // x.push_back(42); 
    std::cout << x.size() << std::endl; 
    } 
    return 0; 
} 

読み取りアクセス用の初期化子リストを使用してfor .. inループをシミュレートすることができます。

2 
1 
0 

私はコメントのように、実際のオブジェクトを変更できるように、私は何をすべきライン:を次のように我々はCから知っているポインタベースのトリックが適用される可能性があります

// x.push_back(42); 
+2

:https://stackoverflow.com/questions/31724863/range-based-for-with -brace-initializer-over-non-const-values –

答えて

17

を使用できstd::reference_wrapper:非常に密接に関連し

for (std::list<int>& x : {std::ref(foo), std::ref(bar), std::ref(baz)}) { 
    x.push_back(42); 
    std::cout << x.size() << std::endl; 
} 
+0

[C++リファレンス](http://en.cppreference.com)を見ている。 std :: reference_wrapperはどこに呼び出されましたか?私。そのツールとは何ですか、どのように動作するのですか、それは何ですか? – zipzit

+0

@zipzit http://ja.cppreference.com/w/cpp/utility/functional/reference_wrapper –

20
for (auto x : { &foo, &bar, &baz }) { 
    x->push_back(42); 
    std::cout << x->size() << std::endl; 
    } 

しかし、これは彼らのコピーとは対照的に、あなたが実際に、オブジェクトを操作することを前提としています。 (あなたが投稿したコードは、もともと、実際のコピーで動作します。)

+0

これは良い点です!私は元のオブジェクトを使って作業していると確信していた。 – marmistrz

関連する問題