从继承的类 C++ 中获取模板类型

Eri*_*248 2 c++ inheritance templates

所以我试图填充从模板类继承的类的自定义集合,就像这样

template<typename T>
class Parent {
public: 
  T value;
  Parent(T val) {value = val;}
}

class ChildA : Parent<int> {
... 
}

class ChildB : Parent<double> {
...
}

// ==== Collections ====
template<typename cT>
class ParentCollection {
public:
  cT list[10];
}

class ACollection : ParentCollection<ChildA> {
...
}

class BCollection : ParentCollection<ChildB> {
...
}
Run Code Online (Sandbox Code Playgroud)

所以我想向 ParentCollection 添加一个函数,它允许我生成并添加一个新的 cT 类型列表数组。这应该由孩子们继承。如果我要在 ACollection 或 BCollection 中编写它,它将类似于:

void ACollection::Add(int val) {...}
Run Code Online (Sandbox Code Playgroud)

或者

void BCollection::Add(double val) {...}
Run Code Online (Sandbox Code Playgroud)

分别。但是,因为除了生成不同的孩子之外,它们都做完全相同的事情,所以我想在 ParentCollection 中写这个,但我不知道如何做这样的事情:

void ParentCollection::Add(T val) {...}
Run Code Online (Sandbox Code Playgroud)

也就是说,在 ParentCollection 的参数中使用来自 Parent 类模板的 T 类型。这样的事情可能吗?或者我必须为两个子集合分别编写添加函数。

Dan*_*our 6

通常公开模板参数是个好主意,因为由于 C++ 没有反射功能,否则在类本身之外获取它们会很麻烦:

// inside parent class
using value_type = T;
Run Code Online (Sandbox Code Playgroud)

然后你可以引用这个 typedef 来指定你的成员函数签名:

void Add(typename cT::value_type val)
Run Code Online (Sandbox Code Playgroud)