Можно ли воссоздать цикл в C ++ с помощью функции - PullRequest
1 голос
/ 26 июня 2011

Я недавно написал простой макрос, потому что я так устал набирать одно и то же для каждого вектора, который мне нужно было пройти по циклу:

#define FORVEC(a,b) for(int b=0;b<a.size();b++)

, чтобы я мог сделать что-то вроде

vector<sometype> stuff

FORVEC(stuff,i)
{
     stuff[i].dosomething();
}

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

mylooperfunction(param1,param2,param3) 
{
     //and now any code here would be run and looped in a way controlled by and defined in mylooperfunction
}

Ответы [ 4 ]

5 голосов
/ 27 июня 2011

В BOOST_FOREACH есть значительно более продвинутая версия, которую вы можете использовать в C ++ 03. То, о чем вы говорите, не в C ++ 03, но - это в C ++ 0x с введением лямбда-выражений.

std::for_each(vec.begin(), vec.end(), [&](const T& ref) {
    ref.do_something();
});

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

1 голос
/ 27 июня 2011

Есть два решения, которые уже делают это: BOOST_FOREACH и std::for_each.

1 голос
/ 27 июня 2011

Алгоритмы STL предоставляют функцию, которую вы ищете: std :: for_each

0 голосов
/ 27 июня 2011

Вот что будет:

  1. вы забыли название вашего макроса
  2. вы начинаете набирать существующие итераторы снова и снова
  3. скоро наберете текст настолько автоматически, что это будет легко и быстро сделать
  4. тогда ваш макрос больше не понадобится

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

...