繁体   English   中英

C ++:从模板类继承并带有可能变化的构造函数参数

[英]C++: Inheriting from template class with possible varying constructor arguments

假设我们有以下示例类:

class A { 
  public:
    explicit A(int foo) { } 

    void test() {
      cout << "I'm in A" << endl;
    }   
};

class B { 
  public:
    explicit B(string bar) { } 

    void test() {
      cout << "I'm in B" << endl;
    }   
};

我想定义一个子类,以从可以专门化为A或B之一的模板化类继承。我面临的问题是A和B具有不同的构造函数参数,因此证明构造Child的构造函数是有点烦人。 如果我执行以下操作,则一切正常:

template <class ParentClass>
class Child : public ParentClass {
  public:
    Child<B>() : ParentClass("foo") {
    }   
};

int main() {
  Child<B> c;
  c.test();
  return 0;
}

但是,我也想做类似Child<A> c事情。 这可能吗?

谢谢!

您可以专攻每个班级:

template <class ParentClass>
class Child : public ParentClass {
  public:
    Child();
};

template <>
Child<A>::Child() : A(42) {}

template <>
Child<B>::Child() : B("42") {}

演示版

您可以尝试使用模板化的构造函数,如下所示:

#include <iostream>

using namespace std;

class A {
public:
    explicit A(int foo) { }

    void test() {
        cout << "I'm in A" << endl;
    }
};

class B {
public:
    explicit B(string bar) { }

    void test() {
        cout << "I'm in B" << endl;
    }
};

template <class Parent>
class Child
: public Parent {

public:
    template <class... Args>
    Child(Args... args)
    : Parent(args...) {

    }
};

int main() {
    Child<A> a_child(42);
    Child<B> b_child("42");
    a_child.test();
    b_child.test();
}

如果要让用户确定参数,则可以使用委托的构造函数:

template <class ParentClass>
class Child : public ParentClass {
public:
    using ParentClass::ParentClass;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM