2009-11-17 1 views
2

나는 정의 할 수 있도록하려면템플릿 기반 함수 오버로드가 다른 기본 클래스의 파생 클래스를 허용하는 방법?

template <class TX> 
void f(const TX &x){ ... } 
template <class TY> 
void f(const TY &x){ ... } 
TX는 BaseX 및 TY에서 파생되어야합니다

는 BaseY (어떻게 이런 종류의 일을 지정합니까?)에서 파생되어야하고, 내가 전화를 할 수 있도록하려면 그것으로

f(DerivedX<T>()) 

내가 템플릿 매개 변수를 지정하지 않도록하는 것이 가장 중요합니다. 이것이 가능합니까? 그렇다면 어떻게 구현할 수 있습니까? 가능하지 않다면 템플릿 함수가 특정 유형 만 받아 들일 수 있도록하는 방법이 있습니까?하지만 여전히 암시 적으로 인스턴스화해야합니까? 나는 파생 클래스 '타입이 필요하기 때문에 기본 클래스를 수락하는 오버로드를 만들 수 없습니다.

답변

6

당신과 같이 Boost.TypeTraits에서 is_base_of를 사용할 수 있습니다

#include <boost/type_traits.hpp> 
#include <boost/utility.hpp> 

class BaseX { }; 
class BaseY { }; 

class DerivedX : public BaseX { }; 
class DerivedY : public BaseY { }; 

template <typename TX> 
boost::enable_if<boost::is_base_of<BaseX, TX>, void>::type 
f(const TX& x) 
{ 
} 

int main(int argc, char** argv) 
{ 
    DerivedX x; 
    DerivedY y; 

    f(x); // compiles 
    f(y); // will cause a compilation error 
} 

Boost.TypeTraits 라이브러리 헤더 전용, 당신은 아무것도를 연결 할 필요가 없습니다

+2

부록 - enable_if가하는 것은 조건이 참이면'type' 멤버 만 있기 때문에'type'을 사용하려고하면 조건을 false로 컴파일하면 컴파일 오류가 발생합니다. 그러나 SFINAE (대체 오류는 오류가 아님)로 알려진 원리 때문에 컴파일러에서 해당 버전의 템플릿을 선택하지 말라고 알려줍니다. 'BaseY'에 다른 템플릿이 있으면 컴파일러는 두 템플릿 중 하나를 생성하지 못하고 다른 템플릿을 사용해야합니다. 유일하게 적합한 템플릿이므로 선택됩니다. – coppro

+0

좋아, 나는 그걸 읽었고, 나는 그들이 내가 한 것 같다. 그러나 나열된 코드는 컴파일되지 않습니다. –

+0

죄송합니다. 복사하여 붙여 넣기에 실패했습니다. 다시 시도하십시오 ('f'의 정의에서 여분의'void '를 제거했습니다). ''f (y);'라는 줄을 제거하면 컴파일러 에러를 일으키는 것을 보여주기 때문에 컴파일해야합니다. –

-1
template <class TX> 
void f(const BaseX &x){ ... } 
template <class TY> 
void f(const BaseY &x){ ... } 

f<DerivedX>(DerviedX<T>()) 

저에게는 가장 쉬운 방법입니다. 명시 적 템플릿 인수를 제공하지 않으려면 boost의 is_base_of을 사용할 수 있습니다.

+0

니스.. 먼저 w/is_base_of로 응답하고 -1. –

관련 문제