template usage case #1
template < typename T >
class T2
{
public:
// typedef typename T::value_type v_type; // --- #1
T2()
{
T::value_type a; // --- #2
a = 1;
}
};
typedef int t1_value_type;
class T1 : public T2< T1 >
{
public:
typedef t1_value_type value_type;
void test() {}
void test1( value_type ) {}
};
void func()
{
T1 a; // --- #3
}
#1은 컴파일이 안되지만, #2는 컴파일이 된다. 왜냐하면 #1의 라인은 T1클래스가 Instantiation되기전에 T2클래스가 먼저 Instantiation된다. 따라서 T2클래스 입장에서 T1::value_type이 존재하는지 하지 않는지 알지 못한다. 하지만 #2의 경우는 이야기가 다르다. #2가 Instantiation되는 타이밍(POI=Point of Instantiation)은 #3의 구문을 보고 그제서야 T2의 생성자가 Instantiation되기 때문이다. 이 시점에서는 T1과 T2의 클래스의 타입은 이미 Instantiation되었기 때문이다. template의 강력함(?) 중 하나는 바로 이것이다.
멤버함수의 경우 실제로 참조하지 않으면 코드를 생성하지 않는 기능. 용량적으로도 코드크기가 줄어서 좋다.
예제로 적은 스타일의 방식을 개인적으로 많이 사용한다. 뭐.. 쓰다보니 이 스타일이 왠지 유용하다. 일반적인 슈퍼클래스의 개념은 단순한 일에 치여 돈만 벌어다 주고 자식에게 관심이 없고 아이들이 혼자 스스로 성장하는 아빠의 느낌이랄까! 하지만 이 방식은 슈퍼클래스인 주제(-_-)에 서브클래스를 좌지우지 하는 이를테면 돈도 많이 버는 아빠지만 주말엔 꼭 아이와 놀아준다는 일도최고가정에도최고인 느낌. -_-;
fin.
