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