您能否模板化未模板化的子类
Can you template specialize a subclass that is not templated?
本文关键字:子类 更新时间:2023-10-16
这是我的情况:
基类,无模板化类型:
struct Thing
{
} ;
模板化类,扩展了该基类
template <typename T> struct VertexWriter : public Thing
{
template <typename S>
bool intersects( S* otherThing )
{
// has a body, returns T or F
}
} ;
派生类,具体类型(无模板)
struct Rocket : VertexWriter<VertexPNCT>
{
template <typename S>
bool intersects( S* otherThing ) ; // WANTS TO OVERRIDE
// implementation in VertexWriter<T>
} ;
但是template typename<S> bool VertexWriter<T>::intersects
不能标记为虚拟,因为它是一个模板类。
类派生自VertexWriter<VertexPNCT>
专用化,因此模板专用VertexWriter<VertexPNCT>
不起作用。
因此,正常的做法是提供模板专用化。
但是Rocket
指定它是一个VertexWriter<VertexPNCT>
,所以它不再是一个模板类。 它能否像虚拟功能一样专门化或覆盖intersects
?
不,正如您所说,您不能使用虚函数,这会提供运行时多态性。
也就是说,根据您在更改类布局方面的余地,您可能可以使用 CRTP 执行某些操作。
template <typename T, typename Derived> struct VertexWriter : public Thing
{
template <typename S>
bool intersects( S* otherThing )
{
return static_cast<Derived*>(this)->insersects_impl(otherThing);
}
template<typename S>
bool insersects_impl( S* otherThing)
{
// Whatever
}
} ;
struct Rocket : VertexWriter<VertexPNCT, Rocket>
{
template <typename S>
bool intersects_impl( S* otherThing ) { ... } // WANTS TO OVERRIDE
// implementation in VertexWriter<T>
} ;
intersects
的基本实现只是转发到 CRTP 函数。 如果派生类重写它,它将使用重写,否则它将回退默认值。 请注意,这确实会使您的类层次结构复杂化,但可能会完成您要查找的内容。
不,你不能。
模板化成员函数不能是虚拟的。
VertexWriter是模板化,专用还是普通类并不重要。
您可以在S
上模板VertexWriter
,并将intersects
作为该类模板的虚拟函数
template <typename T, typename S> struct VertexWriter : public Thing
{
virtual bool intersects( S* otherThing )
{
// has a body, returns T or F
}
} ;
现在,您可以重写派生类中的intersects
template<typename S>
struct Rocket : VertexWriter<VertexPNCT, S>
{
virtual bool intersects( S* otherThing ) ; // WANTS TO OVERRIDE
// implementation in VertexWriter<T>
}
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类