프로젝트에서 저는 기본적으로 정수 타입을 감싸는 클래스를 만들었습니다. 나는 몇 가지 이유로 이것을 선택한다. 먼저 내 가치에 대해 구체적인 것을 알려주는 메소드를 추가하고 싶습니다. 예를 들어 나는이 그냥 예입니다 (is_odd()
라는 방법을 가질 수 둘째, 나는 값이 유효한 범위 내에서 항상 확인 할object와 stil 같은 정수에 유효한 값만 반복하는 방법은 무엇입니까?
을 그래서 내 클래스는 다음과 같이 할 수있다 :..
class C {
public:
// Constructor and some other stuff here including
// post and pre increment operators
inline void CheckInvariant() const
{ assert(0 <= value_ && value_ <= 8);};
private:
std::uint8_t value_;
};
는 지금은이 클래스의 가능한 모든 값을 반복 할 이처럼 :.
for (C c(0); c <= c::max_value; ++c)
{
// Do something
}
심지어 같은 :
// Note here that C::min_value <= c is always true
// because the value wrap-around.
for (C c = C::max_value; C::min_value <= c; --c)
{
// Do something
}
문제는 c가 무효가되어서 c::max_value
이후로 증가하고 연산자에서 CheckInvariant()를 호출하면 ++가 실패합니다.
처음에는 모든 유효 값을 배열에 반복 할 수 있지만이를 사용하는 코드는 실제로 성능에 치명적이며 정수를 직접 사용하는 것보다 빠를 필요가 있습니다. 바인드되는 것은 디버그 모드 (어설트)에서 체크됩니다.
이제 나는 "냄새"와 디자인에 결함이 있음을 이해합니다. 유효하지 않은 값을 방지하고 모든 값을 효율적으로 반복 할 수있는 알려진 패턴이 있습니까?
도움 주셔서 감사합니다.
증분/감소 대신 역 참조 연산자에서 불변량을 확인하십시오. –
클래스의 반복자를 작성하고 for 루프를 사용할 수 있습니다. – yngccc
@yngum 나는 이것에 대해 힘들지만, 정수를 증가시키는 것보다 덜 효율적이라고 생각하는 것이 맞습니까? 이 코드는 실제 성능에 중요한 루프에서 사용됩니다. –