Ответ 1
Вы можете использовать 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;
}
Я могу легко смоделировать цикл for .. in
, используя списки инициализаторов для доступа к чтению
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;
}
Отпечатки:
2
1
0
Что мне делать, чтобы я мог изменять фактические объекты, как в прокомментированной строке:
// x.push_back(42);
Вы можете использовать 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;
}
Трюк, основанный на указателе, который мы знаем из C, может быть применен следующим образом
for (auto x : { &foo, &bar, &baz }) {
x->push_back(42);
std::cout << x->size() << std::endl;
}
Однако это предполагает, что вы действительно хотите работать с исходными объектами, в отличие от их копий. (Код, который вы опубликовали, на самом деле работает с копиями.)