사용 10 :
#include <vector>
#include <cstdio>
using std::printf;
#define FOR(TYPE, IDENT, BEGIN, END) for(TYPE IDENT = BEGIN, IDENT##_end = static_cast<decltype(IDENT)>(END); IDENT < IDENT##_end; ++IDENT)
#define FOR_STEP(TYPE, IDENT, BEGIN, END, STEP) for(TYPE IDENT = (TYPE)(BEGIN), IDENT##_end = static_cast<decltype(IDENT)>(END); IDENT < IDENT##_end; IDENT += STEP)
#define FOR_ITER(IDENT, BEGIN, END) for(auto IDENT = BEGIN, IDENT_end = END; IDENT != IDENT_end; ++IDENT)
int main() {
FOR(int, i, 0, 10) {
printf("FOR i: %d\n", i);
printf("we can even access i_end: %d\n", i_end);
}
FOR(auto, i, 0, 10) {
printf("FOR auto i: %d\n", i);
}
std::vector<int> vec = {4, 5, 7, 2, 3, 1, 4, 9, 8, 6};
printf("FOR with iterator: {");
FOR(auto, it, vec.begin(), vec.end()) {
printf("%d, ", *it);
}
printf("}\n");
printf("FOR with non constant end:\n");
FOR(long, i, 0, vec.size()) {
printf("vec[%ld] = %d\n", i, vec[i]);
}
printf("\n");
// You can set a step size
printf("FOR_STEP(double, d, 0, 20, 2.1): ");
FOR_STEP(double, d, 0, 20, 2.1) {
printf(" %f ", d);
}
printf("\n");
// It works with iterators that don't have "<" but only "!="
// defined, but you probably want to use a range-based 'for' anyway.
printf("FOR_ITER(auto, it, vec.begin(), vec.end()): ");
FOR(auto, it, vec.begin(), vec.end()) {
printf("%d, ", *it);
}
printf("\n");
}
이것은 C++ 11 타겟에 대해 생각해 낼 수있는 최선의 방법입니다. END
인수는 한 번만 평가되며 begin
및 end
은 항상 동일한 유형을 필요로합니다. 그들은 지금 <
운영자가 정의가 필요하기 때문에 당신이 ==
또는 !=
운영자, FOR
매크로 비교에 대한 <
연산자를 사용하는 기본과 평등에 두 배를 테스트하지 말아야 때문에
,이, 반복자의 매크로의 사용을 제한 , 너무. 나는 이중 임의의 반복자와 비슷하게 작동하는 하나의 솔루션을 생각해 낼 수 없었다. 당신은 당신의 필요에 더 잘 맞는 하나의 매크로를 선택할 수 있습니다.
하지만 대부분의 요구 사항에 맞는 매크로 정의 하나만 있으면 코드를 훨씬 쉽게 읽을 수 있기 때문에 모든 매크로를 코드에 포함하면 안됩니다.
매개 변수 (OP가 요청한대로)에서 사용할 심볼 이름을 사용하는 것이 더 나은 이유는 무엇입니까? –
@ πάντα ῥεῖ 당신이 옳습니다. 감사! 나는 그것을 개정했다. –