1

これが私の状況です:

基本クラス、テンプレート化された型なし:

struct Thing
{

} ;

テンプレート化されたクラスは、その基本クラスを拡張します

template <typename T> struct VertexWriter : public Thing
{ 
    template <typename S>
    bool intersects( S* otherThing )
    {
        // has a body, returns T or F
    }
} ;

派生クラス、CONCRETE 型 (テンプレートなし)

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、テンプレート クラスであるため、virtual とマークすることはできません。

特殊化から派生する多くのクラスがあるVertexWriter<VertexPNCT>ため、テンプレートの特殊VertexWriter<VertexPNCT>化は機能しません。

したがって、通常行うべきことは、テンプレートの特殊化を提供することです。

しかし、Rocketそれが であることを指定しているVertexWriter<VertexPNCT>ため、もはやテンプレート クラスではありません。intersects仮想関数であるかのように特殊化またはオーバーライドできますか?

4

3 に答える 3

1

いいえ、あなたが述べたように、実行時のポリモーフィズムを提供する仮想関数を使用することはできません。

とはいえ、クラスのレイアウトを変更する際の余裕によっては、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関数に転送します。派生クラスがオーバーライドする場合はオーバーライドを使用しますが、それ以外の場合はデフォルトにフォールバックします。これはクラス階層を複雑にしますが、探していることを達成する可能性があることに注意してください。

于 2013-01-24T19:45:31.517 に答える
0

VertexWriterテンプレートを作成して、そのクラステンプレートの仮想関数をS作成できます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>
}
于 2013-01-24T19:48:02.433 に答える
0

いいえ、あなたがすることはできません。

テンプレート化されたメンバー関数を仮想にすることはできません。

VertexWriter がテンプレート化されているか、特殊化されているか、または通常のクラスであるかは問題ではありません。

于 2013-01-24T19:36:56.927 に答える