Visual C++ “для каждой” мобильности

Вы можете напрямую проверить грамматику CSS .

В основном 1, имя должно начинаться с подчеркивания (_), a дефис (-) или букву (a - z), за которой следует любое число дефис, подчеркивание, буквы или цифры. Существует улов: если первый символ является дефисом, второй символ должен быть буквой или подчеркиванием, а имя должно быть не менее двух символов.

-?[_a-zA-Z]+[_a-zA-Z0-9-]*

Идентификаторы, начинающиеся с дефиса или underscore обычно зарезервированы для расширений, специфичных для браузера, как в -moz-opacity.

1 Все это немного усложняется включением экранированных символов Unicode (которые никто не использует).

2 Обратите внимание, что в соответствии с грамматикой, с которой я связан, правило, начинающееся с двух дефис, например --indent1, является недопустимым. Тем не менее, я уверен, что видел это на практике.

23
задан Aardvark 24 October 2008 в 16:02
поделиться

8 ответов

Поскольку каждый не стандартный C или синтаксис C++. Если Вы захотите быть в состоянии скомпилировать этот код в gcc или g ++, необходимо будет создать итератор и использовать стандарт для цикла.

QuantumPete

[редактирование] Это, кажется, новая возможность, введенная в Visual C++ MS, таким образом, это определенно не портативно. Касательно: http://msdn.microsoft.com/en-us/library/xey702bw%28VS.80%29.aspx [/редактирование]

25
ответ дан D.Shawley 29 November 2019 в 00:41
поделиться

Я не использовал бы это. В то время как это - заманчивая функция, синтаксис является несовместимым с предстоящим C++ 0x стандарт, который использует:

list<Object> myList;

for (Object o : myList)
{
   o.foo();
}

, чтобы сделать то же самое.

32
ответ дан Ferruccio 29 November 2019 в 00:41
поделиться

Если требуется использовать foreach, и в то же время Вы не хотите добавлять дополнительную зависимость (такую как Повышение) - этот макрос поможет Вам:

#define VAR(V,init) __typeof(init) V=(init)
#define FOREACH(I,C) for(VAR(I,(C).begin());I!=(C).end();I++)

std::vector<int> numbers;

FOREACH(I, numbers)
{
    std::cout << *I << std::endl;
}
6
ответ дан Mike Hordecki 29 November 2019 в 00:41
поделиться

Существует очень хорошая портативная альтернатива: Повышение. Foreach. Просто выведите этот заголовок в свой проект, и можно записать циклы следующим образом:

list<Object> myList;

BOOST_FOREACH(Object o, myList)
    o.foo();
21
ответ дан Konrad Rudolph 29 November 2019 в 00:41
поделиться

Библиотека Повышения имеет портативное устройство ForEach imlementation.

2
ответ дан dummy 29 November 2019 в 00:41
поделиться

Visual C++ "для каждого" не является стандартным C++, означая, что Вы не будете в состоянии скомпилировать свой код других компиляторов, таких как g ++. Однако STL делает предложение станд.:: for_each, но его синтаксис намного менее интуитивен. Вот его прототип:

template <class InputIterator, class UnaryFunction>
UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f);

Это берет два итератора, определяющие допустимый диапазон, и применяет унарную функцию (или функтор) f к каждому объекту в этом диапазоне. Можно переписать пример с помощью станд.:: for_each как это:

void foo(Object o)
{
  o.foo();
}
...
list<Object> myList;

std::for_each(myList.begin(), myList.end(), foo);

Однако, если Вы хотите остаться близко к классическому синтаксису для каждой конструкции, и если Вы в порядке об использовании Повышения, можно использовать BOOST.FOREACH, который позволит Вам записать

list<Object> myList;

BOOST_FOREACH(Object o, myList)
{
    o.foo();
}
5
ответ дан Luc Touraille 29 November 2019 в 00:41
поделиться

Я также рекомендую BOOST_FOREACH. Я обычно создаю макрос вроде:

#define _foreach(x,y) BOOST_FOREACH(x,y)

Это имеет тенденцию увеличивать удобочитаемость. Необходимо быть осторожны относительно коллизий с другими foreach реализациями все же. Например, QT обеспечивает 'foreach' и существует станд.:: for_each.

я нахожу что станд.:: for_each на самом деле не экономит много времени, так как Вы заканчиваете тем, что делали много одноразовых функциональных объектов для предоставления к вызову for_each. Это обычно столь же быстро для создания стандарта использованием для цикла итераторов STL.

0
ответ дан user21714 29 November 2019 в 00:41
поделиться

Мой голос идет для Luc,

Придерживаются стандартных алгоритмов STL, и Вы будете более обеспечены безусловно. Алгоритмы STL могут сделать Вашу жизнь очень легкой, эффективной и безопасной. Смотрите на от отложить алгоритмов как find_if, количество, count_if, вид, преобразуйте, и т.д.

Точка 5 вперед... http://www.sgi.com/tech/stl/table_of_contents.html

Повышение прохладно, но если Вы собираетесь использовать его только для макроса FOR_EACH, это является слишком много громоздким относительно установки разработки/среды сборки.

повышение использования, когда стандартный C++ / stl не может решить проблему 'легким' способом.

-1
ответ дан argatxa 29 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

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