如何定义通用模板签名

How to define generic template signature

本文关键字:何定义 定义      更新时间:2023-10-16

>我有 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>有不同的构造函数。

你只是缺少一个using声明。

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

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

然后,这将为IGenericPart<BaseClass>创建构造函数,这些构造函数与BaseClass的每个构造函数相对应并转发给每个构造函数,因此AB的初始化列表将按预期工作。

请注意,构造函数继承是 C++11 功能,因此必须使用支持 C++11 的编译器在 C++11 模式下进行编译才能正常工作。

如果由于某种原因无法使用 c++11,您可以通过向 IGenericPart 添加以下笨拙的位来使其工作:

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) {}
}