макросы цикла c ++ - PullRequest
       43

макросы цикла c ++

1 голос
/ 06 мая 2009

Я использую макросы для кодирования развернутых циклов следующим образом: (глупый пример)

#define foreach_small_prime(p, instr) {   \
  int p;                                  \
  p = 2; instr;                           \
  p = 3; instr;                           \
  p = 5; instr;                           \
  p = 7; instr;                           \
}

foreach_small_prime(pp, cout << pp);

int sum = 0;
foreach_small_prime(pp, {
  sum += pp;
  if (sum >= 10) cout << sum << endl;
});

Но в некоторых случаях я мог бы использовать для конструкции:

#define foreach_small_even(ii) for(int ii = 0; ii < 20; ii += 2)

int sum = 0;
foreach_small_even(pp) {
  sum += pp;
  if (sum >= 10) cout << sum << endl;
}

Мне нравятся эти макросы, потому что я могу передать в качестве параметра переменную name .

Вопрос: Есть ли способ определить цикл, подобный первому, в синтаксисе for-like, например, во втором макросе?

Ответы [ 3 ]

7 голосов
/ 06 мая 2009

Вы можете проверить препроцессор Boost . Это может делать все виды зацикливания вещей. Синтаксис не очень хороший, но я считаю, что он работает. Однако я сам этим не пользовался.

0 голосов
/ 06 мая 2009

Вопрос: есть ли способ определить цикл, подобный первому, в синтаксисе for-like, например, во втором макросе?

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

const int small_primes[MAX_SMALL_PRIMES] = {2, 3, 5, 7, 11, 13};

#define foreach_small_prime(pp) \
  for (int i = 0; i < MAX_SMALL_PRIMES; pp = small_primes[++i])

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

void f() {
  int sum = 0;
  int temp = 0;
  foreach_small_prime(temp) {
    sum += temp;
    if (sum >= 10) cout << sum << endl;
  }
}

Вероятно, вы хотите отбросить таблицу поиска и MAX_SMALL_PRIMES свое пространство имен, чтобы избежать беспорядка ... и использование широко используемого идентификатора 'i' в макросе, вероятно, плохой выбор. Я уверен, что есть и другие способы улучшить его, но это в основном то, что вы просите.

0 голосов
/ 06 мая 2009

У вас есть веская причина избегать использования объекта-итератора? Вы должны рассмотреть ваши первые макросы 4x ваш код INSTR ...

В противном случае просто:

#define foreach_smallprime(ii) for(int ii = 0; ii <= 7; ii = next_prime(ii) )

с next_prime(ii), определенным в том же файле, что и макрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...