首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板继承和varargs

模板继承和varargs
EN

Stack Overflow用户
提问于 2017-03-03 20:23:38
回答 3查看 97关注 0票数 2

如何使用可变参数列表实现X构造函数和初始化Base类?

代码语言:javascript
复制
#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或更高标准

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-03 20:35:51

代码语言:javascript
复制
template <class Base>
class X: public Base
{
public:
    X(int a, int b) : Base(a, b) { }
    X(int a) : Base(a) { }
};

是的,这实际上是有效的。X的构造函数只有在你尝试使用它们时才会被实例化,所以一切都很好,没有讨厌的varargs需要处理!

票数 2
EN

Stack Overflow用户

发布于 2017-03-03 21:33:35

如果你可以使用C++11,我宁愿这样做

代码语言:javascript
复制
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;从基类继承所有构造函数。

票数 1
EN

Stack Overflow用户

发布于 2017-03-03 20:55:50

一种C++11方法是使用可变模板

代码语言:javascript
复制
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中的一种方法:

代码语言:javascript
复制
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
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42578823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档