Is Derived #


처음에 이 소스에서 template의 가능성을 보고 뒷통수를 맞은 기분 이었습니다.
기본적인 내용은 Base에서 Derived가 상속 되었느냐를 확인 하는 코드 입니다.
이 예제 뿐만 아니라 Modern C++ Design(Andrei Alexandrescu)에는 무궁무진한 template의 향연이 펼쳐집니다.


아래의 예제는 More Exceptional C++(Herb Sutter)에 나오는 내용입니다.
원본은 Andrei Alexandrescu에 의해 작성된 글이라고 More Exceptional C++에서 명시 하고 있습니다.
제가 컴파일러에서 테스트하고 수정한 소스입니다.
//////////////////////////////////////////////////////// 
#include <iostream>
using namespace std;


template <class Derived, class Base>
class IsDerived
{
private:
    class YES { char c[2]; };
    class NO {};

    static YES Test(Base *p);
    static NO Test(...);

public:
    // VC++, g++ 문제 없음 
    static bool Is()
    {
        return (sizeof(Test(static_cast<Derived *>(0))) == sizeof(YES));
    }

    // VC++ 문제없음 
    // g++ 3.2 컴파일 안됨 
    // g++ 3.4.1 에서는 문제 없음
    // enum { Is = (sizeof(Test(static_cast<Derived *>(0))) == sizeof(YES)) }; 

};


class B {};

class C : public B
{};


int main()
{
    cout << IsDerived<C, B>::Is() << endl;
}

'Dev > C++' 카테고리의 다른 글

C++ 0x  (0) 2008.05.09
memory pooling - code  (0) 2008.05.01
C++에서 프로퍼티 구현하기  (0) 2008.05.01
boost::pool 예제  (0) 2008.05.01
STLport 초간단 설치  (1) 2008.05.01

+ Recent posts