2010-07-30 9 views
1

내 주요 프로젝트의 클래스는 템플릿 클래스로 선언 부동 소수점 데이터 유형 (float 또는 double). 이 매개 변수를 기반으로이 클래스의 인스턴스에는 특정 유형의 멤버가 있고 벡터 (연산)에는 dim 구성 요소 수가 있습니다.액세스 회원

인스턴스가 멤버 유형에 따라 다를 수 있으며 해당 함수의 매개 변수 유형이 다르지만 모두 동일한 함수 정렬을 사용합니다. 런타임으로 만들 수있는 항목은 다음으로 만든이 클래스의 인스턴스 함수에 일반적으로 액세스합니다. 다른 템플릿 인자들 ???

+0

여기서 어떤 문제가 발생합니까? 이러한 객체를 어떻게 호출 할 것인지 예를들 수 있습니까? 나는 당신이 @Tyler McHenry의 방법을 필요로하지 않는다고 생각한다 (그것은 정확하다, 단지 과잉 일 것이다). 당신이 필요로하는 메소드와 멤버로 클래스를 정의하고, 컴파일하지 않는 것을 가지고있을 때 다시 제안 해주세요 :-) "template struct X {void f (typ t);}; " –

답변

3

이것은 정확히 상속을위한 것입니다. 그런 다음

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, TypBaseDimBase 모든 (적어도 하나의 구현되지 않은 가상 메서드를 포함하는) 추상 클래스, 그리고 그것을 Base에서 TypBaseDimBase 상속이 virtual public 대신 사용하는 것을 필수 것을 권장합니다 것을

주 단지 public 일 경우, 그렇지 않으면 "dreaded diamond"이 표시됩니다.

+0

타일러는 대답 해 주셔서 감사합니다. 단순 상속은 문제가 아니며, 내가 가진 가장 큰 문제는 차원 및 유형에 의존하는 함수 매개 변수입니다. vec . 그들에 대해서? –

+0

제 답변의 두 번째 부분에서는 차원 또는 유형에 의존하는 메소드에 대해 다형성 동작을 얻는 방법에 대해 설명합니다. * dimension과 type 모두에 의존하는 메소드는 리프 클래스에 정의되어야하며 다형성으로 사용할 수 없습니다. 생각해보십시오 : 메소드에 대한 인수가 클래스의 차원과 유형에 따라 다르면 다른 차원과 유형을 가진 클래스의 객체에서 같은 메소드를 호출 할 수 있습니까? 그런 일은 말이되지 않을 것입니다. –