2017-03-03 1 views
2

X 생성자를 구현하고 가변 인수 목록이있는 Base 클래스를 초기화하는 방법은 무엇입니까?템플릿 상속 및 varargs

#include<cstdarg> 

class A 
{ 
private: 
    int m_a; 
public: 
    A(int a): m_a(a) {} 
}; 

class B: public A 
{ 
private: 
    int m_b; 
public: 
    B(int a, int b):A(a), m_b(b){} 
}; 

template <class Base> 
class X: public Base 
{ 
public: 
    //X(...):Base(...) 
}; 

int main() 
{ 
    X<A> x(7) 
    X<B> x(3,5); 
    return 0; 
} 

나는 A, B 클래스를 수정할 수 없습니다입니다. 는 C++ 11 이상 표준

+2

'X '에 대해 두 개의 다른 생성자를 사용하는 것은 어떻습니까? –

+0

그러면 두 사람은 동시에 A와 B와 호환되어야합니다. (내가 귀하의 제안을 올바르게 이해 한 경우) – ataman

+0

아니요, 단일 매개 변수와 두 개의 매개 변수가있는 하나의 생성자가있는 하나의 생성자를 가질 수 있습니다. 그런 다음 적절한 것을 사용하십시오. 'X'는 템플릿이므로, 여러분이 사용하는 멤버들만 인스턴스화됩니다. –

답변

2
template <class Base> 
class X: public Base 
{ 
public: 
    X(int a, int b) : Base(a, b) { } 
    X(int a) : Base(a) { } 
}; 

예,이 실제로 작동을 사용할 수 없습니다. X의 생성자는 시도하고 사용할 때까지 인스턴스화되지 않으므로 모두 정상입니다. 처리 할 불쾌한 변수는 없습니다!

0

한 C++ (11)의 방법이 포트는 C++ 03에 가변 인자 템플릿을

template <class Base> 
class X: public Base 
{ 
public: 
    X(const X&) = default; 
    X(X&&) = default; 

    template <typename ...Ts> 
    X(Ts&&...args) : Base(std::forward<Ts>(args)...) {} 
}; 

한 가지 방법을 사용하는 것입니다 :

template <class Base> 
class X: public Base 
{ 
public: 
    X() : Base(t) {} 
    X(const X& x) : Base(x) {} 

    template <typename T> X(const T& t) : Base(t) {} 
    template <typename T1, typename T2> X(const T1& t1, const T2& t2) : Base(t1, t2) {} 
    template <typename T1, typename T2, typename T3> 
    X(const T1& t1, const T2& t2, const T3& t3) : Base(t1, t2, t3) {} 
    // ... Up to N args 
}; 
1

당신이 C++ (11)를 사용할 수있는 경우, 나는 차라리해야한다.

class A 
{ 
private: 
    int m_a; 
public: 
    A(int a): m_a(a) {} 
}; 

class B: public A 
{ 
private: 
    int m_b; 
public: 
    B(int a, int b):A(a), m_b(b){} 
}; 

template <class Base> 
class X: public Base 
{ 
public: 
    using Base::Base; //Magic trick 
}; 

int main() 
{ 
    X<A> x1(7); 
    X<B> x2(3,5); 
    return 0; 
} 

가변성 템플릿을 사용하는 메타 트릭 대신.

Using Base :: Base; 기본 클래스에서 모든 생성자를 상속합니다.