如何定义通用模板签名

时间:2014-11-20 04:21:30

标签: c++ c++11

我有2个类,其中的功能是复制和粘贴。这些类之间的唯一区别是每个继承的类。这些超类具有相同的调用签名,但构造函数不同。

我试图做类似的事情:

template<class BaseClass>
class IGenericPart : public BaseClass {
 public:
  int commonCall1() { return 10; }
  int commonCall2() { return 44; }
};

class A : public IGenericPart<RealBaseClass1> {
 public:
  A(int x) : IGenericPart<RealBaseClass1> (x, b) {}
};

class B : public IGenericPart<RealBaseClass2> {
 public:
  B(string z) : IGenericPart<RealBaseClass2> (z, anothertype2, anothertype2) {}
};

但我不知道如何使IGenericPart类具有基于泛型BaseClass的正向构造函数。 所以基本上,我需要IGenericPart<RealBaseClass1>IGenericPart<RealBaseClass2>具有不同的构造函数。

2 个答案:

答案 0 :(得分:1)

您只是错过了using声明。

当类IGenericPart<>继承自BaseClass时,它不会自动从BaseClass继承构造函数。要继承构造函数,必须使用using声明显式地执行此操作,如下所示:

template<class BaseClass>
class IGenericPart : public BaseClass {
 public:
  using BaseClass::BaseClass;
  // etc ...
};

然后,这会为IGenericPart<BaseClass>创建与BaseClass的每个构造函数对应的构造函数,因此AB的初始化列表将作为预期

请注意,构造函数inheritence是一个C ++ 11特性,因此您必须使用支持C ++ 11的编译器在C ++ 11模式下进行编译才能实现此功能。

答案 1 :(得分:1)

如果由于某种原因无法使用c ++ 11,可以通过将以下笨重的位添加到通用部分来使其工作:

template<class BaseClass>
class IGenericPart: public BaseClass {
  public:
    template <typename A>
    IGenericPart(A a) : BaseClass(a) {}

    template <typename A, typename B>
    IGenericPart(A a, B b) : BaseClass(a, b) {}

    template <typename A, typename B, typename C>
    IGenericPart(A a, B b, C c) : BaseClass(a, b, c) {}
}