Domanda

Uso le macro per codificare loop non srotolati in questo modo: (esempio sciocco)

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

Ma in alcuni casi potrei usare per construct:

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

Mi piacciono queste macro perché posso passare una variabile nome come parametro.

Domanda: esiste un modo per definire il loop come il primo in una sintassi for-like come la seconda macro?

È stato utile?

Soluzione

Puoi consultare la libreria Boost preprocessore . Può fare ogni sorta di cose in loop. La sintassi non è eccezionale, ma credo che funzioni. Non l'ho usato da solo, tuttavia.

Altri suggerimenti

Hai una buona ragione per evitare di usare un oggetto iteratore? Devi considerare le tue prime paste macro 4x il tuo codice instr ...

Altrimenti, un semplice:

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

con next_prime (ii) definito nello stesso file della macro.

  

Domanda: esiste un modo per definire il loop come il primo in una sintassi for-like come la seconda macro?

Suppongo che tu abbia una serie relativamente piccola di numeri primi, quindi creare un look per i tuoi numeri primi non dovrebbe essere troppo problematico. Se hai bisogno di generare un elenco più ampio di numeri primi, sono sicuro che nella libreria Boost è disponibile un po 'di magia di meta-programmazione di modelli in fase di compilazione. Se hai una serie più complessa di numeri che stai generando, potrebbe essere saggio trasformare la ricerca in una funzione che memorizza nella cache i risultati man mano che vengono generati.

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

Utilizzato come:

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

Probabilmente vogliono lanciare la tabella di ricerca e MAX_SMALL_PRIMES il loro spazio dei nomi per evitare disordine ... e usare un identificatore comunemente usato 'i' nella macro è probabilmente una scelta sbagliata. Sono sicuro che ci sono altri modi per migliorarlo, ma questo è fondamentalmente quello che stai chiedendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top