음.. 우리나라 말로 번역하면, "템플릿 친구 만들기"로 표현되는데, 무슨 말인고 하면, "클래스에 friend 선언시 클래스 템플릿 또는 함수 템플릿를 firned 하기" 를 말한다.
예로 쓸 함수는, boost의 checked_delete 함수 템플릿을 사용해 보기로 한다. 이 함수의 헤더 파일은 boost/checked_delete.hpp 이다. 전문은 아래 소개 한다.
이 전문의 32라인, 33라인이 이해가 가지 않아 KLDP 에 질문을 올려, 답변을 받아 보았다. 링크
정리 하자면, forword declaration(전방 선언)경우, operator delete 가 재정의 되었거나, 가상 소멸자를 호출해서 삭제해야 되는 경우, 예기치 않은 동작을 할 수 있기 때문에, 컴파일 타임에 오류를 보고 받기 위함의 코드인 것이다.
이야기가 다른 곳에 갔는데, 다시 출발점으로 와서, 아래와 같은 상황이 있다고 생각해 보자. 이런 경우는 자주 있는것은 아니지만, 간혹 있을 수 있다.(객체의 소멸을 특정 함수에서만 처리하고자 하고 싶을 때... )
이 때 boost::checked_delete 를 어떻게 friend 하는게 좋을까?
허브 셔터는 다음과 같은 질문으로, 논쟁을 유도 한다.
1) boost::checked_delete 를 friend 로 만드는, 표준을 만족하는 방법은 무엇인가?
여러가지가 있겠지만, 다음과 같이 정의 할 수 있겠다.
2 ) 질문 1) 의 답변이 신뢰할 수 없는 이유와 더 신뢰 할 수 있게 만드는 방법은 무엇인가?
신뢰 할 수 없는 이유는 함수 템플릿은 특성상 매개변수의 타입을 추론하여, 인스턴스화 되어지는데, 컴파일러마다, 이 추론 과정이 다른 이름공간에 있는 함수 템플릿일 경우, 추론하기 어렵기 때문이라고 한다.
더 신뢰 할 수 있게 만드는 방법
지침
보다 표현하고자 하는 기능을 보다 명시적으로 표현하는게 더 좋다는 것이 허브셔터의 요약이다.
총평
함수 템플릿을 friend 로 하는 방법은 위의 두 방법이 있는데, 그 중 아래 방법을 선호하는게 더 좋다. 왜냐하면, 첫번째는 항상 작동하지 않을 수 있기 때문이다. 두번째도 항상 작동하는것은 아니지만, 첫번째보다 이식성이 그나마 조다. gcc 컴파일러에서 안되지만, 뭐 그런데로 쓸만하니, 참고해야겠다.
'책 정리 > Exceptional C++ Style' 카테고리의 다른 글
항목 13 : 예외 명세에 대한 실용적인 고찰 ( 난이도 : 6 ) (1) | 2009.01.14 |
---|---|
항목 12 : 예외 안전성 : 추구할 가치가 있는가? ( 난이도 : 7 ) (1) | 2009.01.13 |
항목 11 : try 와 catch ( 난이도 : 3 ) (1) | 2009.01.13 |
항목 10 : export의 한계, 2부 : 상호작용, 유용성 문제, 지침들 ( 난이도 : 9 ) (1) | 2009.01.13 |
항목 9 : export의 한계, 1부 : 기초 ( 난이도 : 7 ) (1) | 2009.01.13 |
항목 7 : 함수 템플릿을 특수화하지 말아야 하는 이유 ( 난이도 : 8 ) (4) | 2009.01.09 |
항목 6 : 여러 수준의 일반성, 2부 : 충분히 일반적인가? ( 난이도 : 7 ) (0) | 2009.01.08 |
항목 5 : 여러 수준의 일반성, 1부 : 기초 ( 난이도 : 4 ) (2) | 2009.01.02 |
항목 4 : 표준 라이브러리 멤버 함수 ( 난이도 : 5 ) (0) | 2008.12.31 |
항목 3 : 문자열 포매팅, 2부 : 표준의 세련된 대안들 (0) | 2008.12.29 |
최근댓글