如何为模板类参数指定所需的继承
How do I specify a required inheritance for a template class argument?
我有以下结构:
class ElementEx
{
public:
ElementEx() {}
AddChild(ElementEx* element)
{
// some stuff
}
};
class A : ElementEx
{
public:
A() {}
};
class B : ElementEx
{
public:
B() {}
};
template <class T>
class MyNewClass : public T
{
public:
MyNewClass()
{
ElementEx* newElement = new ElementEx();
AddChild(newElement);
}
};
创建 MyNewClass 对象时,T 必须继承自 A 或 B,因此 MyNewClass 将从 ElementEx 继承。但是在我的示例中,编译器不知道这一点,也无法弄清楚AddChild是什么。如何确保 T 类是 ElementEx 的后代?
我在想象做
((ElementEx*)this)->AddChild(newElement);
但这似乎真的很不优雅(如果错误的类型被输入为 T,并且容易出错),我认为一定有更好的方法来做到这一点。
编译器在这里抱怨,因为它不知道AddChild
在第一次传递期间依赖于T
。 可以通过在调用前面加上 this->
来使AddChild
成为依赖名称,从而在已知T
时延迟查找到第二次传递。
只要
你满足于父类支持AddChild
接受ElementEx
,你就可以使用正常的编译器错误轻松做到这一点。
在修复了代码中的一堆错误(A 和 B 私下继承,你所有的类都有私有构造函数,AddChild
没有返回类型)我能够通过向 AddChild
调用中添加 this->
来使其正常工作,因为AddChild
是一个依赖名称,您可以通过限定类型或添加 this->
来向编译器指示。如果您预计不需要对该方法进行虚拟调用,则可以调用ElementEx::AddChild
来强制进行正确的查找。更正后的代码如下。
class ElementEx
{
public:
ElementEx() {}
void AddChild(ElementEx* element)
{
// some stuff
}
};
class A : public ElementEx
{
public:
A() {}
};
class B : public ElementEx
{
public:
B() {}
};
template <class T>
class MyNewClass : public T
{
public:
MyNewClass()
{
ElementEx* newElement = new ElementEx();
this->AddChild(newElement);
}
};
struct Bad {};
int main()
{
MyNewClass<B> b; // Compiles.
MyNewClass<Bad> bad; // error: 'class MyNewClass<Bad>' has no member named 'AddChild'
}
有几种方法可以很好地做到这一点,但它们都有使用 1.) 静态断言的基础。 2)静态评估函数。
个人,我会使用(在构造函数中)
static_assert(std::is_base_of<ElementEx,T>::value,"T must derive from ElementEx")
但可能有一个更好的方法。您问题的 X 部分是什么(您想通过这种奇怪的继承结构实现什么目标?
相关文章:
- 为什么C++构造函数在继承中需要默认参数?
- C++接口继承不同的参数方法
- 如何在继承层次结构中调用具有默认参数的构造函数?
- 模板的继承参数设置
- 使用多参数包可变参数模板继承类
- 使用继承初始化C++中的参数
- 可变参数模板和具有继承的默认值
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 从作为模板参数传递给构造函数的类继承,或者从它们继承
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- 继承基构造函数,基类是模板参数 (MSVC)
- C++ 函数的继承,传入参数
- C++ 模板元编程:从模板模板参数继承
- 类成员在继承的情况下用作模板参数
- C++中模板参数的类继承
- 继承专业化的模板参数推导
- 继承类模板的参数化构造函数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- 具有可变模板的递归继承和继承参数问题
- 函数是否可以继承参数