Вопрос: есть ли способ определить цикл, подобный первому, в синтаксисе 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' в макросе, вероятно, плохой выбор. Я уверен, что есть и другие способы улучшить его, но это в основном то, что вы просите.