Ответ 1
Взгляните на:
- Условная любовь для понимания обоснования
- Pitfalls раздел документации
- Раздел Portability на всякий случай, если вы разрабатываете кросс-платформенные продукты.
- Страница ошибок для BOOST_FOREACH
Это для экспертов Boost. Есть ли какие-либо подробности или детали, о которых программист должен знать, прежде чем он войдет и заменит все свои старые циклы стиля C/С++ на художественно-ориентированный BOOST_FOREACH
?
(Этот вопрос частично получен из здесь.)
Взгляните на:
BOOST_FOREACH - макрос, мне не нравятся макросы и предпочитают использовать алгоритмы STL + lambda + bind.
Также С++ 0x будет содержать for-loop аналогично на BOOST_FOREACH:
int my_array[5] = {1, 2, 3, 4, 5};
for(int &x : my_array)
{
x *= 2;
}
это еще одна причина, по которой не используйте частично мертвые BOOST_FOREACH.
Как это просто макрос, вы не можете использовать запятые в именах типов, так что
BOOST_FOREACH(pair<int,int> A, mapB){}
не будет работать.
Для других недостатков я бы посоветовал документацию BOOST_FOREACH().
Я профилировал BOOST_FOREACH
по сравнению с контуром с ручным кодированием.
BOOST_FOREACH
был примерно на 30% медленнее в простом цикле, который увеличивал элементы вектора размером 100 000.
Итак, если вы кодируете небольшой цикл, это будет не так быстро. Как только ваша петля выполняет основную обработку, закон Amdahl вводится, а потеря из-за BOOST_FOREACH
незначительна.
Взгляните на источник макроса BOOST_FOREACH (в foreach.hpp) - это не то, что я бы назвал "худым и средним": -)