从模板类继承,可能有不同的构造函数参数

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

本文关键字:构造函数 参数 可能有 继承      更新时间:2023-10-16

假设我们有以下样例类:

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