문제

나는 매크로를 사용하여 다음과 같은 Unrolled 루프를 코딩합니다.

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

그러나 어떤 경우에는 구성에 사용할 수도 있습니다.

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

변수를 전달할 수 있기 때문에이 매크로가 마음에 듭니다. 이름 매개 변수로.

질문 : 두 번째 매크로와 같은 유사 구문에서 첫 번째 루프처럼 루프를 정의하는 방법이 있습니까?

도움이 되었습니까?

해결책

부스트를 확인할 수 있습니다 전처리 서 도서관. 모든 종류의 반복 작업을 수행 할 수 있습니다. 구문은 훌륭하지는 않지만 효과가 있다고 생각합니다. 그러나 나는 그것을 직접 사용하지 않았습니다.

다른 팁

반복자 객체를 사용하지 않는 좋은 이유가 있습니까? 첫 번째 매크로 페이스트를 고려해야합니다. 4 배 귀하의 악기 코드 ...

그렇지 않으면 단순 :

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

~와 함께 next_prime(ii) 매크로와 동일한 파일로 정의됩니다.

질문 : 두 번째 매크로와 같은 유사 구문에서 첫 번째 루프처럼 루프를 정의하는 방법이 있습니까?

나는 당신이 소수의 비교적 작은 작업 세트를 가지고 있다고 생각합니다. 따라서 프라임을 조회하는 것이 너무 번거 롭지 않아야합니다. 더 큰 프라임 목록을 생성 해야하는 경우 부스트 라이브러리에 사용할 수있는 컴파일 타임 템플릿 메타 프로그래밍 마법이 있다고 확신합니다. 더 복잡한 일련의 숫자가 있다면 생성하는 결과가 생성 될 때 결과를 캐시하는 함수로 조회를 바꾸는 것이 현명 할 수 있습니다.

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'를 사용하는 것은 아마도 불량한 선택 일 것입니다. 나는 그것을 개선하는 다른 방법이 있다고 확신하지만, 이것은 근본적으로 당신이 요구하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top