C ++:从模板类继承可能的不同构造函数参数

时间:2016-09-26 21:30:24

标签: c++ templates inheritance

假设我们有以下示例类:

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之类的事情。这是 可能的?

谢谢!

3 个答案:

答案 0 :(得分:5)

您可以专注于每个班级:

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

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

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

Demo

答案 1 :(得分:3)

您可以按如下方式尝试模板化构造函数:

#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();
}

答案 2 :(得分:1)

如果您想让用户决定参数,您可以使用委托构造函数:

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