您能否模板化未模板化的子类

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