template argument에 따른 함수 선택 문제
Published by Nineye under Nineye's 미해결 과제 on February 28, 2009캐쉬 클래스를 만드는데, 기본적인 지도를 캐쉬하는 mrcache와 동적으로 생성되는 데이터를 캐쉬하는 rrcache 두 가지 종류의 캐쉬가 있다.
여기서 하고자 하는 것은 첫 번째 read 함수를 호출하는 record의 타입에 따라,
이 record의 타입이 어떤 캐쉬에 속해 있는지 판단하여, 아래 두 read 함수를 결정하게 하는 것이다.
기본적인 구조는,
class mrCacheHdr : 지도를 캐쉬하는 class
mrCacheHdr::__DataList : mrCacheHdr내에 포함되는 record들의 Loki::TypeList
아래 코드에 대해 간단히 설명하면,
첫 번째 read 함수에서, 받아들인 record 타입에 대해 mrCacheHdr::__DataList에 포함되었는지 판단하여 그 판단값을 Loki::Int2Type을 통해 또 다른 타입으로 만들고, 이 타입을 다시 다음 read 함수에 넘긴다.
이제, 두 번째와 세 번째 함수중에 선택이 될 건데, 이 두 함수를 간단히 설명하면,
두 번째 함수는 모든 타입을 다 받아들일 수 있도록 default로 구현하고, 세 번째 함수는 -1에 대한 타입만을 받아들일 수 있게 구현한다(여기서 -1은 Loki::TypeList 포함 체크에서 포함이 되지 않았을 때 생성되는 상수이다).
즉, class mrCacheHdr에 포함되지 않는 record를 첫 번째 함수가 받아들이면, 첫 번째 함수는 Loki::Int2Type<-1>의 타입으로 특화된 세 번째 함수와 연결시키고,
나머지는 두 번째 함수와 연결시킨다.
template <class __RecType>
int read(__RecType& obj, int mapid, int id, int rank) {
return read(Loki::Int2Type<Loki::TL::IndexOf<
typename mrCacheHdr::__DataList, __RecType>::value>
, obj, mapid, id, rank);
}
template <class __SelType, class __RecType>
int read(__SelType, __RecType& obj, int mapid, int id, int rank) {
...
return 0;
}
template <>
int read<Loki::Int2Type<-1>, __RecType>(
Loki::Int2Type<-1>, __RecType& obj, int mapid, int id, int rank) {
...
return 0;
}
일단 여기서 가장 큰 문제는 함수는 부분 특화될 수 없다는 것이다.
세 번째 함수를 보면 첫 번째 template argument가 특화되었는데, 두 번째 argument는 특화되지 않았다.
흠… 다른 좋은 구조가 없을까…
과연 이 문제를 해결할 수 있을까??? ㅡㅡ;;;
네.. 들러주셔서 감사합니다~
template에 대해 공부하다보면 무한한 가능성에 놀라실 거에요..
저도 처음에는 그저 자바의 object class의 개념처럼 생각했는데,
그런 개념을 훨씬 뛰어 넘어서, template 그 자체의 의미보다 그것을 만들어내면서
창조된 수많은 사상들은 정말 엄청난 가능성을 가지고 있더라고요..
template에 관심 있으시면 자주 들러주세요 ㅎㅎ
템플릿에 대해 공부하다가 들르게 되었는데,
템플릿을 이렇게 특이하게 이용할 수도 있군요
새로운 사실을 알게되었네요
잘 보고 갑니다. 앞으로 종종 들를게요 ^^