模板继承和varargs



如何用variadic参数列表实现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或更高标准

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

是的,这实际上有效。在尝试使用它们之前,X的构造函数不会实例化,因此一切都很好。没有讨厌的varargs可以处理!

如果您可以使用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;
}

而不是使用variadic模板的元编剧。

使用base :: base;从基类继承所有构造函数。

一个C 11方法是使用variadic模板

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

相关内容

  • 没有找到相关文章

最新更新