Frage

Ich verwende Makros abgerollt Schleifen wie folgt zu kodieren: (dummes Beispiel)

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

Aber in einigen Fällen könnte ich für Konstrukt verwenden:

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

Ich mag dieses Makros, weil ich eine Variable übergeben kann name als Parameter.

Frage: Gibt es eine Möglichkeit Schleife wie die ersten in einer for-like Syntax wie das zweite Makro zu definieren

?
War es hilfreich?

Lösung

Sie könnten die Boost-Check-out Präprozessor Bibliothek. Es können alle Arten von looping Dinge tun. Die Syntax ist nicht groß, aber ich glaube, es funktioniert. Ich habe es nicht benutzt mich aber nicht.

Andere Tipps

Haben Sie einen guten Grund, mit einem Iterator-Objekt zu vermeiden? Sie haben Ihre erste Makro Pasten betrachten Sie Ihre Instrumente Code 4x ...

Ansonsten einfach:

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

mit next_prime(ii) in der gleichen Datei als Makro definiert.

  

Frage: Gibt es eine Möglichkeit Schleife wie die ersten in einer for-like Syntax wie das zweite Makro zu definieren

?

Ich denke, man eine relativ kleine Arbeitsgruppe von Primzahlen, also ein Look-up für Ihre Primzahlen zu schaffen nicht zu lästig sein sollte. Wenn Sie eine größere Liste von Primzahlen generieren müssen, ich bin sicher, es gibt einig Kompilierung-Vorlage Meta-Programmierung Magie in der Boost-Bibliothek zur Verfügung. Wenn Sie eine komplexere Reihe von Zahlen haben sind Sie erzeugen könnte es klug sein, die Lookup in eine Funktion zu aktivieren, die die Ergebnisse zwischenspeichert, wie sie erzeugt werden.

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

Wird als:

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

Wahrscheinlich wollen die Lookup-Tabelle werfen und MAX_SMALL_PRIMES theirown Namespace Unordnung zu vermeiden ... und unter Verwendung eine allgemein verwendete Kennung ‚i‘ im Makro ist wahrscheinlich eine schlechte Wahl. Ich bin sicher, es gibt auch andere Möglichkeiten, es zu verbessern, aber das ist im Grunde, was Sie fordern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top