BOOST_FOREACH и шаблоны без определения типа

Я использую ShrinkSafe из проекта Dojo - это исключительно, потому что это на самом деле использует интерпретатор JavaScript ( Носорог ) для контакта с нахождением символов в коде и понимании их объема, и т.д. который помогает гарантировать, что код будет работать, когда это выйдет другой конец, в противоположность большому количеству инструментов сжатия, которые используют regex, чтобы сделать то же (который не так надежен).

у меня на самом деле есть задача MSBuild в веб-Проект Развертывания в моем текущем решении для Visual Studio, которое выполняет сценарий, который в свою очередь выполняет все файлы решения JS через ShrinkSafe, прежде чем мы развернемся, и это работает вполне хорошо.

РЕДАКТИРОВАНИЕ: Между прочим, "лучше всего" открыто для дебатов, так как критерии "лучшего" будут варьироваться в зависимости от потребностей проекта. Лично, я думаю, что ShrinkSafe является хорошим балансом; для некоторых людей, которые думают самый маленький размер == лучше всего, это будет недостаточно.

РЕДАКТИРОВАНИЕ: стоит отметить, что компрессор YUI также использует Носорога

10
задан Anton Kazennikov 11 November 2009 в 07:40
поделиться

2 ответа

Проблема состоит в том, что это макрос, и поэтому он не может обрабатывать типы, содержащие запятые (препроцессор не знает о шаблонах).

Вы также можете объявить переменную перед циклом, см. документацию .

std::map<int, double> my_map;

//1)
typedef std::pair<int, double> MyPair;
BOOST_FOREACH(MyPair p, my_map) { ... }

//2)
std::pair<int, double> p;
BOOST_FOREACH(p, my_map) { ... }

Редактировать:

В частности, с std :: map есть дополнительные сложности: value_type не std :: pair , а std :: pair .

Следовательно, если вы используйте typedef, более правильный способ (и единственный способ, если вы хотите использовать ссылку в цикле foreach) - использовать

typedef std::pair<const int, double> MyPair;
//or
typedef std::map<int, double>::value_type MyPair;

BOOST_FOREACH(MyPair& ref, my_map) { ... }

. Однако это не сработает, если вы хотите использовать переменная, объявленная перед циклом, так как вы не можете присвоить std :: pair

12
ответ дан 3 December 2019 в 15:35
поделиться

BOOST_FOREACH_PAIR - еще один вариант, который, по нашему опыту, хорошо работает:

http://lists.boost.org/Archives/boost/2009/09/156345.php

http://lists.boost.org/Archives/boost/2009/09/156366.php

6
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: