2017-06-06 12 views
12

mogę łatwo symulować for .. in pętli przy użyciu list initializer dla dostępu odczytuJak używać pętli listy inicjalizacyjnej do modyfikowania elementów?

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; 
} 

Drukuje:

2 
1 
0 

Co należy zrobić, aby można było modyfikować rzeczywistych obiektów, podobnie jak w skomentowała linia:

// x.push_back(42); 
+2

bardzo ściśle powiązane: https://stackoverflow.com/questions/31724863/range-based-for-with -brace-initializer-over-non-const-values ​​ –

Odpowiedz

17

Można użyć 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

Patrzę na [odniesienie C++] (http://en.cppreference.com). Gdzie wywoływany jest std :: reference_wrapper? To znaczy. Czym jest to narzędzie, jak działa, co robi, itp.? – zipzit

+0

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

20

sztuczka wskaźnik oparty na które znamy z C może być stosowany w sposób następujący

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

Jednak ta zakłada, że ​​faktycznie chcą pracować z oryginalnych obiektów, w przeciwieństwie do ich kopii. (Kod ty pisał początkowo faktycznie działa z kopiami).

+0

To dobry punkt! Byłem dość pewny, że pracuję z oryginalnymi obiektami – marmistrz

Powiązane problemy