2010-08-21 7 views
1

나는 this advice about template parameter constraints를 통해 읽어 봤는데,이 선으로 혼동되었다템플릿 매개 변수 제약

template<class T> class Container : Derived_from<T,Mybase> { 
    // ... 
}; 

여기 무슨 일이야? 이것은 컴파일러가 원하는 체크를 수행하기 위해 Derived_from을 검사하도록하는 데 사용되는 평범한 오래된 상속입니까? 이 코드가 Derived_from에 대해 생성되는 코드로 이어지지 않는 이유는 무엇입니까?

감사합니다.

답변

2

정확하게 동일한 URL에 표시된 Derived_from의 출처를 살펴보십시오!

template<class T, class B> struct Derived_from { 
    static void constraints(T* p) { B* pb = p; } 
    Derived_from() { void(*p)(T*) = constraints; } 
}; 

어떤 코드 당신이 기대

컴파일러가 최적화 할 수 있도록 (하나 개의 희망이) 쉽게해야하는 Derived_from의 생성자가 하나의 초기화 외에 발생한다? 그리고 constraints 정적 메소드는 T에 대한 포인터가 B에 대한 포인터에 올바르게 할당 될 수 있는지 확인합니다. 물론 우리가 원하는 제약 인 B에서 T이 실제로 파생 된 순수 컴파일 타임 검사로 바뀌어야합니다.

1

이러한 검사를 수행하는 함수가 부작용이없는 변환 만 수행하면 옵티마이 저는 해당 전체 코드를 최적화하고 함수 본문에 대한 코드를 생성하지 않습니다. 남겨진 유일한 것은 기능 기호와 복귀 명령입니다.

GCC 4.5.1로 테스트 한 결과 함수의 기호조차 필요가 없습니다. 컴파일러는 주소 지정을 최적화하고 그 파일에 다른 코드가 없으면 코드를 내보내지 않고 해당 함수에 액세스합니다. 그 정의를 필요로하는 다른 번역 단위는 그 자체로 정의를 제공하기 때문에 괜찮습니다 - 그래서 그들은 다른 번역 단위의 편집에 의존하지 않습니다.

Container<T> 개체를 만들면이 방법을 사용하면 검사는 트리거 만합니다. 그렇지 않으면 Derived_from의 생성자가 암시 적으로 인스턴스화되지 않고 검사가 수행되지 않습니다.

boost::is_base_of과 같은 더미 코드없이이 작업을 완료하는 방법이 있습니다.