Pregunta

Uso macros para codificar bucles desenrollados como este: (ejemplo tonto)

#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;
});

Pero en algunos casos podría usar para construir:

#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;
}

Me gustan estas macros porque puedo pasar una variable name como parámetro.

Pregunta: ¿Hay alguna forma de definir un bucle como el primero en una sintaxis similar a la segunda macro?

¿Fue útil?

Solución

Puede consultar la biblioteca Boost preprocesador . Puede hacer todo tipo de cosas en bucle. La sintaxis no es excelente, pero creo que funciona. Sin embargo, no lo he usado yo mismo.

Otros consejos

¿Tiene una buena razón para evitar usar un objeto iterador? Debe considerar sus primeras pastas macro 4 veces su código de instr ...

De lo contrario, un simple:

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

con next_prime (ii) definido en el mismo archivo que la macro.

  

Pregunta: ¿Hay alguna forma de definir un bucle como el primero en una sintaxis similar a la segunda macro?

Supongo que tienes un conjunto de números primos relativamente pequeño, por lo que crear una búsqueda de números primos no debería ser demasiado problemático. Si necesita generar una lista más grande de primos, estoy seguro de que hay algo de magia de metaprogramación de plantillas en tiempo de compilación disponible en la biblioteca Boost. Si tiene una serie de números más compleja que está generando, puede ser conveniente convertir la búsqueda en una función que almacene en caché los resultados a medida que se generan.

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])

Utilizado como:

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

Probablemente quiera tirar la tabla de búsqueda y MAX_SMALL_PRIMES su propio espacio de nombres para evitar el desorden ... y usar un identificador de uso común 'i' en la macro es probablemente una mala elección. Estoy seguro de que hay otras formas de mejorarlo, pero esto es fundamentalmente lo que estás pidiendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top