Pergunta

Eu uso macros ao código laços desenroladas como este: (exemplo bobo)

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

Mas em alguns casos eu poderia usar para construção:

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

Eu gosto deste macros porque eu posso passar uma variável nome como um parâmetro.

Pergunta: Existe uma maneira de definir loop como o primeiro de uma for-like sintaxe como a segunda macro

?
Foi útil?

Solução

Você pode verificar o impulso pré-processador biblioteca. Ele pode fazer todos os tipos de looping coisas. A sintaxe não é grande, mas eu acredito que ele funciona. Eu não usei isso mesmo, no entanto.

Outras dicas

Você tem uma boa razão para evitar o uso de um objeto iterador? Você tem que considerar suas primeiras pastas macro 4x seu código instr ...

Caso contrário, um simples:

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

com next_prime(ii) definido no mesmo arquivo como o macro.

Pergunta: Existe uma maneira de definir loop como o primeiro de uma for-like sintaxe como a segunda macro

?

Eu acho que você tem um relativamente pequeno trabalho-conjunto de números primos, criando assim um look-up para seus primos não deve ser muito problemático. Se você precisar gerar uma lista maior de números primos, eu tenho certeza que há algum tempo de compilação mágica modelo de meta-programação disponível na biblioteca Boost. Se você tem uma série mais complexa de números que você está gerando pode ser sábio para transformar a pesquisa em uma função que armazena os resultados como eles são gerados.

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

Usado como:

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

Provavelmente quer jogar a tabela de pesquisa e MAX_SMALL_PRIMES theirown namespace para evitar confusão ... e usando um identificador comumente usado 'i' na macro é provavelmente uma má escolha. Estou certo de que há outras maneiras de melhorá-lo, mas isso é fundamentalmente o que você está pedindo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top