2012-08-23 3 views
0

의 (타입 T에) 내가 좋아하는 일을하고 싶습니다.템플릿 멤버 함수 비 템플릿 클래스 T

가능한 해결 방법은 F() 비회원 만들 수 있습니다 :

template<typename T> 
void f(T* t); 

또는 CRTP를 사용하여 : http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

그러나 위와 같이 할 수없는 C++ 구문이 없다?

EDIT : 코드가 2 클래스 A와 B에 의해 공유되는 큰 함수 f()가 있습니다. A와 B는 f()가 사용하는 동일한 인터페이스를가집니다. 그러나 런타임 polimorphism (즉, 가상 함수)을 사용하지 않기 때문에 컴파일 타임에 A (한 번)와 B (한 번) 템플릿을 두 번 인스턴스화해야합니다.이 목적으로 템플릿을 정확하게 작성해야합니다. 필자의 경우 함수 f()는 템플릿 유형이 * this 유형의 템플릿 함수 여야합니다.

+0

위의 (위키)는 완벽한 유효한 C++ 구문입니다. 그러나 당신이 묻는 것을보고 나는 위와 같은 일을하는 것에 대한 어떤 속기도하지 않습니다. 적어도 C++ 03 세계에서, 내가 아는 한. – nullpotent

+0

달성하려는 것은 무엇입니까? 하나의 "템플릿"정의로 여러 정의를 축소 할 수 없습니다. 당신은 전처리기를 사용하여 비슷한 효과를 얻을 수 있습니다. –

+2

당신이하고 싶은 것은 무엇입니까? 작성된 구문없이 단지 설명. –

답변

1

다음은 무료 함수를 사용하고 instance.f() 구문을 유지하는 예입니다. 개인 메서드에 액세스하려면 함수를 친구로 표시해야합니다.

2

자유 함수가 정답입니다. 이 특별한 이유 때문에 멤버 함수보다 무료 함수를 선호해야합니다. 클래스에 침입하지 않고 인터페이스를 확장합니다.

이 경우 템플릿이없는 자유 함수는 모든 경우가 아닌 두 가지 경우에만 작동하기 때문에 약간 추한 것입니다. 다음과 같이해야합니다.

namespace detail 
{ 
    template <typename T> 
    void f(T* t) 
    { 
     // implement stuff 
    } 
} 

void f(A* x) 
{ 
    detail::f(x); 
} 

void f(B* x) 
{ 
    detail::f(x); 
} 

이제 오버로드를 통해 해당 기능에 대한 액세스를 제한 할 수 있습니다.

관련 문제