如何使用可变参数列表实现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;
}我不允许修改A,B类。无法使用c++11或更高标准
发布于 2017-03-03 20:35:51
template <class Base>
class X: public Base
{
public:
X(int a, int b) : Base(a, b) { }
X(int a) : Base(a) { }
};是的,这实际上是有效的。X的构造函数只有在你尝试使用它们时才会被实例化,所以一切都很好,没有讨厌的varargs需要处理!
发布于 2017-03-03 21:33:35
如果你可以使用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;从基类继承所有构造函数。
发布于 2017-03-03 20:55:50
一种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
};https://stackoverflow.com/questions/42578823
复制相似问题