2017-12-09 6 views
2

나는 구현 된 몇 가지 메소드와 몇 개의 가상 메소드로 구성된 templatized 인터페이스 클래스를 가지고있다.지시어와 부분적 특성화 사용하기

일부 메서드의 서명을 수정하기 위해서는이 메서드를 특수화해야하지만 다른 메서드는 그대로 유지해야합니다.

using 지시어를 통해 원래의 템플릿에서 같은 방법으로 다시 가져 오는 방법을 직접 호출하거나 다른 방법으로 가져 오는 방법이 있습니까? 아니면 모든 단일 메서드를 다시 복사하여 붙여 넣기해야합니다. 전문화?

template <typename T> 
struct X { 
    void faa(T t) const { std::cout << t << '\n'; } 
    void foo() const { std::cout << "foo\n"; } 
}; 

template <> 
struct X<void> { 
    void faa() const { std::cout << "none\n"; } 

    // Something along these lines 
    // using X<T>::foo; 
    // void foo() const { X<T>::foo(); } 
}; 

답변

4

이렇게 보입니다. using 지시어를 사용하여 다른 서명으로 X에있는 함수를 가져올 수 없습니다. 템플릿에서 특수화로 모든 것을 복사하는 것보다 더 나은 해결 방법이 있습니다. "공통 기본 클래스"를 사용할 수 있습니다. X<T>::faaX<void>::faa 동안 그냥 X_base<void>::foo 같은 이런 식으로

template <typename T> 
struct X_base { 
    void foo() const { std::cout << "foo\n"; } 
}; 

template <typename T> 
struct X : public X_base<T> { 
    void faa(T t) const { std::cout << t << '\n'; } 
}; 

template <> 
struct X<void> : public X_base<void> { 
    void faa() const { std::cout << "none\n"; } 
}; 

, X<void>::foo 행위는 서로 간섭하지 않는다.