이것은 정확히 상속을위한 것입니다. 그런 다음
class Base {
public:
virtual ~Base() {};
virtual void foo() = 0;
virtual int bar(int param) = 0;
// Etc, for whatever other methods you want
};
당신이 그것에서 템플릿을 유도 : 당신은 당신의 모든 템플릿에서 사용되는 인터페이스를 정의하는 공통 템플릿이 아닌, 순수 가상 기본 클래스, 예를 들면 만들
template<int dim, typename typ>
class Dervied : public Base
{
public:
virtual ~Derived();
virtual void foo();
virtual int bar(int param);
// Etc, for whatever other methods you want
private:
std::vector<typ> data;
};
을 그리고 물론 Derived
템플릿의 메소드를 구현하십시오. 그런 다음 포인터 또는 Base
에 대한 참조를 통해 Derived
의 인스턴스화에 액세스 할 수 있습니다. 예를 들면 :
void callFoo(const Base& b)
{
b.foo();
}
int main()
{
Derived<3,float> d_f3;
Derived<2,double> d_d2;
callFoo(d_f3);
callFoo(d_d2);
return 0;
}
그것은 Derived
의 모든 인스턴스 생성 사이에 공통적으로 몇 가지 방법이있을 수 있습니다처럼 설명에서 들리지만, 템플릿 매개 변수, 예를 들어,에 의존하는 일부 그것은 Derived<n,float>
에이 메소드를 호출하는 것은 의미가 없습니다 것이기 때문에
void addNumber(typ number);
는이 경우,
Base
에이 기능을 끌어 수 없습니다. 수에 의존하는 유형의 일부에 의존하는 일부 기능이있는 경우에, 당신은 다음과 같이 그 아이디어를 캡슐화 기본 클래스를 만들 수 있습니다 : 이것은 당신이를 사용하는 독립적 인 메소드를 호출 할 수
class Base
{ /* All methods independent of template parameters */ };
template <int dim> DimBase : virtual public Base
{ /* All methods dependent only on the dimension parameter */ };
template <typename typ> TypBase : virtual public Base
{ /* All methods dependent only on the type parameter */ };
template<int dim, typename typ>
Derived : public DimBase<dim>, public TypBase<typ>
{ /* All methods */ };
Base
포인터 또는 참조 DimBase<n>
포인터 또는 참조를 사용하여 차원 종속적 인 메서드를 호출하고 TypBase<T>
포인터 또는 참조를 사용하여 형식 종속 메서드를 호출 할 수 있습니다. 위에서, Base
, TypBase
및 DimBase
모든 (적어도 하나의 구현되지 않은 가상 메서드를 포함하는) 추상 클래스, 그리고 그것을 Base
에서 TypBase
및 DimBase
상속이 virtual public
대신 사용하는 것을 필수 것을 권장합니다 것을
주 단지 public
일 경우, 그렇지 않으면 "dreaded diamond"이 표시됩니다.
여기서 어떤 문제가 발생합니까? 이러한 객체를 어떻게 호출 할 것인지 예를들 수 있습니까? 나는 당신이 @Tyler McHenry의 방법을 필요로하지 않는다고 생각한다 (그것은 정확하다, 단지 과잉 일 것이다). 당신이 필요로하는 메소드와 멤버로 클래스를 정의하고, 컴파일하지 않는 것을 가지고있을 때 다시 제안 해주세요 :-) "template struct X {void f (typ t);}; " –