,
template <typename T> void closed_range(T begin, const T end)
if (begin <= end) {
do {
// do something
} while (begin != end && (++begin, true));
}
}
저주는, 내 첫 번째 시도는 잘못, 위의 수정은 내가 기대했던만큼 꽤하지 않습니다. 에 대해 어떻게 :
template <typename T> bool advance(T &value) { ++value; return true; }
template <typename T> void closed_range(T first, const T last)
if (first <= last) {
do {
// do something
} while (first != last && advance(first));
}
}
std::advance
2 개 매개 변수를 사용하기 때문에 T는, 정수 유형이 아닌 경우에도 std::advance
에 모호함이 없습니다. 그래서 템플리트는 임의의 이유로 당신이 그것들의 닫힌 범위를 원한다면 예를 들어 랜덤 액세스 반복자와 함께 작동 할 것입니다.
또는 설정 이론이 조금 어때요? 분명히 닫힌 범위에 대해 하나의 루프 만 쓰는 경우 이것은 엄청난 과잉입니다.하지만 당신이 많이하고 싶은 것이 있다면 루프 코드를 올바르게 만듭니다. 확실하지 효율성에 대해 : 당신이 게양되어 endof
에 확인 전화를 할 수 있습니다 정말 꽉 루프 :
는
#include <limits>
#include <iostream>
template <typename T>
struct omega {
T val;
bool isInfinite;
operator T() { return val; }
explicit omega(const T &v) : val(v), isInfinite(false) { }
omega &operator++() {
(val == std::numeric_limits<T>::max()) ? isInfinite = true : ++val;
return *this;
}
};
template <typename T>
bool operator==(const omega<T> &lhs, const omega<T> &rhs) {
if (lhs.isInfinite) return rhs.isInfinite;
return (!rhs.isInfinite) && lhs.val == rhs.val;
}
template <typename T>
bool operator!=(const omega<T> &lhs, const omega<T> &rhs) {
return !(lhs == rhs);
}
template <typename T>
omega<T> endof(T val) {
omega<T> e(val);
return ++e;
}
template <typename T>
void closed_range(T first, T last) {
for (omega<T> i(first); i != endof(last); ++i) {
// do something
std::cout << i << "\n";
}
}
int main() {
closed_range((short)32765, std::numeric_limits<short>::max());
closed_range((unsigned short)65533, std::numeric_limits<unsigned short>::max());
closed_range(1, 0);
}
출력 :
32765
32766
32767
65533
65534
65535
는 omega<T>
객체에 다른 연산자를 사용하여 약간의주의하십시오. 필자는 데모의 절대 최소값만을 구현했으며 omega<T>
은 암시 적으로 T
으로 변환되므로 오메가 객체의 "무한 성"을 버릴 수있는 표현식을 작성할 수 있습니다. 산술 연산자의 전체 집합을 선언 (반드시 정의 할 필요는 없음)하여 해결할 수 있습니다. 또는 isInfinite가 true 인 경우 변환에서 예외를 throw합니다. 또는 생성자가 명시 적이기 때문에 우연히 결과를 오메가로 다시 변환 할 수 없다는 사실을 염려 할 필요가 없습니다. 예를 들어 omega<int>(2) < endof(2)
은 true이지만 omega<int>(INT_MAX) < endof(INT_MAX)
은 false입니다.
<대신 <=? –
@ralu : 질문의 핵심은 <=, <가 아니라는 것입니다. 이것이 닫힌 범위와 반 개방 범위의 차이입니다. –
흥미로운 질문입니다. "size_t i = 10; i> 0; -i)'는'size_t '가 도달 할 수있는 최소값 (unsigned)이기 때문에 의미가 없습니다. –