2012-09-19 3 views
4

다중 상속 및 가상 상속을 방지하기 위해 템플릿 상속을 사용하도록 선택했습니다. 내 목표는 다양한 자식 (4 또는 5 세대 또는 제어 할 수없는 상속)을 파생시키는 것과 관계없이 공통 함수 호출을 만드는 것입니다.템플릿 상속을 사용하여 조부모 생성자 호출

은 내 솔루션도록 템플릿 상속을 삽입한다 :

template <typename BASE> 
class common_call : public BASE { 
public: 
    void foo() { /*implementation independent of base*/ } 
}; 

class child1 : public common_call <base1> {}; 
class child2 : public common_call <base2> {}; 

이베이스의 생성자를 호출하는 문제가있다. Base1과 Base2 클래스 (저에게 쓰여지지 않은 클래스)는 초기화 목록에서 호출해야하는 생성자가 다릅니다. common_call 템플릿은 이러한 생성자에 대해 아무 것도 모릅니다. 그러나 자식 클래스는 현재 자신이 직접 상속하는대로 수행합니다. 내가베이스 가능한 경우의 각 유형에 대한 부분 템플릿 특수화을 피하기 위해 노력하고있어

class child3 : public common_call<base3>{ 
public: 
    child3(param1, param2) : base3(param2) {/*do things here*/} 
}; 

:

내가이 작업을 수행 할 수있는 방법이 있습니까.

+1

당신은 C++ 11을 사용하고 있습니까? 이 경우 variadic 템플릿과 완벽한 포워딩을 사용하여 모든 인수를 현재 기본 클래스에 전달하는 'common_call'에 생성자를 추가 할 수 있습니다. – Grizzly

+0

구현이 기본 클래스와 관련이 없다면 단순히'base'와'common_call'의 상속을 개별적으로 상속하지 않는 것이 어떻습니까? – Puppy

+0

내가 언급 한 것을 잊어 버린 몇 가지 사실 : foo() 함수는 공통 조상 ANCESTOR (base1, base2 및 base3 do)에서 파생되는 한 BASE 유형에 의존하지 않습니다. 반면에 자식 클래스는 base1 등으로부터 파생되어야합니다. 그래서 ANCESTOR를 두 번 상속받지 않도록하려고합니다. 불행히도 제 환경에서는 C++ 11이 아직 허용되지 않습니다. 그것이 있었다면 많은 문제가 사라질 것입니다. – Filipp

답변

2

이 같은 가변 인자 템플릿을 사용하여 템플릿 생성자를 common_call 줄 경우

template <typename BASE> 
class common_call : public BASE 
{ 
public: 
    // C++11 variadic templates to define whole range of constructors 
    template<typename... Args> 
    common_call(Args&&... args) 
    : 
     BASE(std::forward<Args>(args)...) 
    {} 

    void foo() { /*implementation independent of base*/ } 
}; 

그런 다음 어떤 템플릿 인수로 common_call에서 파생 할 수 있습니다 (예 : base3를) 및 클래스에 정의되어 그 어떤 생성자 호출

class child3 
: 
    public common_call<base3> 
{ 
public: 
    child3(Type1 param1, Type2 param2) 
    : 
     common_call(param2), // call constructor overload with 1 parameter of Type2 
     t1_(param1)   // initialize t1_ member 
    {} 

private: 
    Type1 t1_; 
};