특정 템플릿 유형에 대해 다른 구현이 필요한 메소드가있는 템플릿 클래스가 있습니다. 어떻게해야합니까?특정 클래스 템플릿 유형에 대한 템플릿 클래스 메소드의 다른 구현
4
A
답변
3
해당 유형의 메소드를 전문화 할 수 있습니다. 예 :
template<typename T>
struct TemplatedClass
{
std::string methodA() {return "T methodA";}
std::string methodB() {return "T methodB";}
std::string methodC() {return "T methodC";}
};
// Specialise methodA for int.
template<>
std::string TemplatedClass<int>::methodA()
{
return "int methodA";
}
4
이 특정 유형에 대해 partial (or full) specialization을 만들어야합니다.
2
티모의 대답은 컴파일러가 자동으로 특수 유형으로 기본 형식에서 멤버 함수를 복사하지 않습니다 즉, 당신은 전체 클래스를 전문으로 할 수 있습니다.
다른 모든 것을 다시 만들지 않고 클래스의 특정 메서드를 특수화하려면 좀 더 복잡합니다.
이template<typename T> struct TypeHolder { };
template<typename T> class TemplateBase {
public:
void methodInterface() {
methodImplementation(TypeHolder<T>);
}
void anotherMethod() {
// implementation for a function that does not
// need to be specialized
}
private:
void methodImplementation(TypeHolder<int>) {
// implementation for int type
}
void methodImplementation(TypeHolder<float>) {
// implementation for float type
}
};
컴파일러는 methodInterface
에 해당 methodImplementation
인라인뿐만 아니라 크기 제로 구조체를 생략하다, 그래서이 될 것입니다 : 당신은이 같은 인수로 크기 제로 템플릿 구조체를 전달하여 그것을 할 수 있습니다 마치 회원 기능에 대해서만 전문화를 수행 한 것처럼 말입니다.
관련 문제
- 1. 템플릿 유형에 기반한 C++ 템플릿 클래스 리팩토링
- 2. 템플릿 기본 클래스 함수 포인터 유형에 액세스
- 3. 다른 템플릿 클래스 (오류 LNK2001)를 사용하여 템플릿 클래스 연결
- 4. 파생 클래스 생성자 인수 유형에 따라 기본 클래스 템플릿 인스턴스화
- 5. 특수 템플릿 클래스 함수에서 특수 템플릿 클래스 함수 호출
- 6. 템플릿 클래스 용 인터페이스
- 7. 중첩 템플릿 클래스 디자인
- 8. 링커 오류를주는 템플릿 클래스
- 9. 템플릿 클래스 제한
- 10. 템플릿 클래스 함수 재정의
- 11. Eclipse : Java 클래스 템플릿
- 12. 템플릿 인수가 클래스
- 13. 템플릿 클래스 및 벡터
- 14. C++ 템플릿 - 매트릭스 클래스
- 15. 템플릿 매개 변수 번호로 템플릿 클래스 오버로드
- 16. 클래스 템플릿 생성자 특수화
- 17. 템플릿 클래스 내에서 함수의 템플릿 전문화
- 18. 전화 템플릿 클래스 내에서 템플릿 함수
- 19. 템플릿 클래스 자체 인 C++ 스페셜 인스턴스 템플릿 클래스
- 20. C++ 템플릿 클래스 오차
- 21. 템플릿 중첩 클래스/구조
- 22. C++의 템플릿 클래스
- 23. 템플릿 클래스 생성 오류
- 24. 템플릿 구조체 클래스 유형으로
- 25. 다중 상속 템플릿 클래스
- 26. 템플릿 기본 클래스 초기화
- 27. QT : 템플릿 Q_OBJECT 클래스
- 28. 템플릿 클래스 및 오버로드 '=='
- 29. C++ 템플릿 클래스 상속
- 30. 클래스 템플릿 C에서 ++/CLI
전체 유형을 전문화해야하지만, 일부만 멤버 함수를 특수화 할 수는 없습니다. 이것은 해답에 함축되어 있지만 오해를 불러 일으킬 수 있습니다. –
기본 클래스를 사용하여 기본 구현을 제공하고이 기본 클래스의 생성자/소멸자를 사용하지 않도록 보호함으로써이 제한을 극복 할 수 있습니다. –