2017-03-03 118 views
2

如何實現X構造函數並使用可變參數列表初始化Base類?模板繼承和可變參數

#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; 
} 

我不允許修改AB類。 不能使用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的方式是使用可變參數模板

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)...) {} 
}; 

一種方式來港,在C++ 03:

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; 
} 

而不是使用可變模板的元技巧。

使用Base :: Base;從基類繼承所有構造函數。