2010-01-28 2 views
0

C++에서 템플릿 어설 션?

assertsInheritsFrom<A, B> 

는 경우에만,

class A : public B { ... } // struct A is okay too 

감사를 컴파일

assertInheritsFrom<A, B> 

있도록 템플릿을 정의 할 수있는 방법입니다!

+0

사이드 노트 : * 템플릿 * (뒤에 s 포함)은보다 일반적인 태그입니다. –

+0

좋아요. 받아 들였다. 롤백하지 않습니다. – anon

답변

5

정적 결합은 Boost.TypeTraits에서 is_base_of<Base,Derived>와 주장 :

BOOST_STATIC_ASSERT(boost::is_base_of<B, A>::value); 

는 다음과 같이 보일 수 있습니다 (정수형, 개인 기본 클래스 및 모호성의 관리 복용하지 않음) 원래 구현 :

template<class B, class D> 
struct is_base_of { 
    static yes test(const B&); // will be chosen if B is base of D 
    static no test(...);  // will be chosen otherwise 
    static const D& helper(); 
    static const bool value = 
     sizeof(test(helper())) == sizeof(yes); 
    // true if test(const B&) was chosen 
}; 
+0

어떻게 작동하는지 설명해 주시겠습니까? (ie is_base_of가 구현 된 방법, 내 이해력을 넘어선 것입니다.) – anon

+0

오픈 소스 라이브러리입니다 : http://www.boost.org/doc/libs/1_41_0/libs/type_traits/doc/html/boost_typetraits/reference/ is_base_of.html –

+1

Travis, 답변과 동일한 링크이며 실제로 작동하는 방식을 설명하지 않습니다. 코드를 검사해도 반드시 설명 할 필요는 없습니다. 때때로 산문이 도움이됩니다. 하지만 아마도 Stack Overflow 주석에 들어 맞는 양은 아닙니다. Anon, 코드를 읽으려고했지만 아직 이해가 안되면 새로운 질문을 올리십시오. (Boost의 is_base_and_derived.hpp와 몇 가지 링크로 설명하기위한 노력이 있음을주의하십시오.) –