2017-03-03 126 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;从基类继承所有构造函数。