Диапазон MSVC 10 для петли - PullRequest
       0

Диапазон MSVC 10 для петли

3 голосов
/ 10 февраля 2012

В настоящее время в большом проекте c ++, над которым мы работаем, у нас есть несколько новых стилей для циклов, таких как:

for (auto& value : values)

До сих пор мы работали исключительно с gcc 4.6. Недавно часть кодовой базы была портирована на Windows, и некоторые разработчики хотят компилировать в msvc ++ 10, но кажется, что новый синтаксис цикла for не полностью поддерживается.

Было бы крайне желательно не переписывать все места, где встречается этот синтаксис.

Как лучше всего обойти эту проблему?

Обновление: похоже, что эта проблема решена в MSVC11.

Ответы [ 4 ]

7 голосов
/ 10 февраля 2012

Вы можете использовать Boost.Foreach :

//Using Xeo's example:
BOOST_FOREACH (auto& e, values) {
    std::cout << e << " ";
}
3 голосов
/ 10 февраля 2012

Одним из способов было бы заменить их std::for_each и лямбдами, где это возможно. GCC 4.6 и MSVC10 поддерживают лямбда-выражения.

// before:
for(auto& e : values){
  std::cout << e << " ";
}

// after:
std::for_each(values.begin(), values.end(),
    [](a_type& e){
      std::cout << e << " ";
    });

Единственное предостережение в том, что вам необходимо ввести имя элемента (здесь a_type), и что вы не можете использовать структуры потока управления (break, continue, return).

Другим способом было бы, когда вам нужны эти структуры потока управления, использовать старые циклы for. С ними все в порядке, особенно с auto для вывода типа итератора.

Еще одним способом может быть использование бета-версии Visual Studio 11, когда она выйдет, она поддерживает циклы на основе диапазона для IIRC. :)

2 голосов
/ 27 марта 2014

Вам не нужно использовать повышение.
Вот простой макрос для обратной совместимости с vs2010:

// 1600 is VS2010
#if _MSC_VER == 1600
    #define FOR_EACH(var , range) for each(var in range)
#else
    #define FOR_EACH(var , range) for (var : range)
#endif

Используйте это так:

FOR_EACH(auto& e, values) {
    std::cout << e << " ";
}
0 голосов
/ 26 мая 2014

Вы можете использовать for each сам

for each (auto value in values) {
std::cout << value << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...