더북(TheBook)

T 타입 인수는 범위에 있는 값 타입이므로 반드시 숫자 타입이어야 한다. 템플릿 본문에 static_assert()는 첫 번째 인수가 false이면 T가 정수나 부동소수점 타입이 아니라는 뜻이므로 두 번째 인수에 지정된 문자열과 함께 컴파일 타임 에러 메시지를 생성할 것이다. 여기서 사용한 조건자 템플릿들은 type_traits 헤더에 정의되어 있다. 이 헤더 파일에는 템플릿 타입 인수의 타입을 컴파일 타임에 검사할 수 있는 다양한 조건자가 정의되어 있다. Numeric_Range 생성자의 매개변수 세 개는 기본값이 지정되어 있고, 인수 없는(no-arg) 생성자도 정의되어 있다. 세 가지 매개변수는 초깃값, 증가값, 값의 개수를 지정한다. 따라서 기본값은 두 가지 값, 0과 1로 범위를 정의한다. 여기서는 컴파일러가 제공하는 복제 생성자로 충분하다.

나머지 함수 멤버 begin()end()는 범위에 대한 시작 반복자와 끝 반복자를 생성한다. 끝 반복자의 value 멤버는 범위에 있는 마지막 값에서 하나 더 증가한 값으로 지정된다. 끝 반복자에 적합한 값을 설정하기 위해 끝 반복자는 시작 반복자를 수정해서 생성된다. Numeric_Iterator<T> 템플릿 타입의 선언이 Numeric_Range 템플릿 정의 앞에 있는 이유는 반복자 타입을 위한 템플릿이 아직 정의되지 않았기 때문이다. Numeric_Iterator<T> 템플릿은 Numeric_Range 템플릿에 대해 friend로 지정되어 있으므로 반복자 템플릿의 인스턴스가 Numeric_Range<T>private 멤버에 접근할 수 있다. 또한, Numeric_Range<T> 템플릿도 Numeric_Iterator<T> 템플릿의 friend로 선언되어야 하는데, 이는 범위를 정의하는 Numeric_Range<T> 템플릿의 end() 멤버가 Numeric_Iterator<T> 템플릿의 private 멤버에 접근하기 때문이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.