-1

私は次のシナリオを持っています:-

template <typename T>
class Base {
  public:
    virtual void someFunc() {}
};

class Derived : public Base<int>,
                public Base<float> {
  public:
    virtual void someFunc() { 
      // do something different if Base<int> than if Base<float>
    }
};

Derived *d = new D();
Base<int>* b1 = (Base<int>*) d;
Base<float>* b2 = (Base<float>*) d;

b1->someFunc();
b2->someFunc();

これら 2 つの関数呼び出しを区別できるようにしたいと考えています。つまり、2 つの基本関数を異なる関数本体でオーバーライドします。

4

3 に答える 3

3

shim を使用できます (これは、テンプレートに関連するかどうかに関係なく、基本クラス間の名前の競合のインスタンスに対して機能します)。

template <typename T>
class Base
{
  public:
    virtual void someFunc() {}
};

class IntShim : public Base<int>
{
  protected:
    virtual void someFuncViaInt() = 0;
  public:
    virtual void someFunc() { return someFuncViaInt(); }
};

class FloatShim : public Base<float>
{
  protected:
    virtual void someFuncViaFloat() = 0;
  public:
    virtual void someFunc() { return someFuncViaFloat(); }
};

class Derived : public IntShim, public FloatShim
{
  protected:
    virtual void someFuncViaInt()
    { 
      // do something for Base<int>
    }
    virtual void someFuncViaFloat()
    { 
      // do something for Base<float>
    }
};

Derived *d = new D();
Base<int>* b1 = (Base<int>*) d;
Base<float>* b2 = (Base<float>*) d;

b1->someFunc();
b2->someFunc();
于 2012-06-22T17:12:24.520 に答える
0

someFuncこれを実装する方法の 1 つは、 on にダミー パラメータを追加することBaseです。

virtual void someFunc(T *dummy = nullptr);

派生クラスでは、オーバーライドは次のとおりです

virtual void someFunc(int *);
virtual void someFunc(float *);

T *空の型を作成する代わりに

template<typename T> struct dispatch {};
...
virtual void someFunc(dispatch<T> = dispatch<T>());
...
virtual void someFunc(dispatch<int>);
virtual void someFunc(dispatch<float>);

これにより、nullptr を渡す際の (最小限の) オーバーヘッドがなくなり、パラメーターの目的が明確になります。

于 2012-06-22T17:12:10.797 に答える
0

そのために仮想関数と派生クラスを使用する必要はありません。基本クラスの関数を既知の型に特化するだけです。

あなたはsthを行うことができます。このような:

template <typename T>
class Base {
  public:
    void someFunc()
    {
        // default implementation for any type
    }
};

// specialization for int
template<> void Base<int>::someFunc()
{
}

// specialization for float
template<> void Base<float>::someFunc()
{
}

int main(int argc, char** argv)
{
    Base<int>* b1 = new Base<int>();
    Base<float>* b2 = new Base<float>();

    b1->someFunc();
    b2->someFunc();
}
于 2012-06-22T17:12:21.650 に答える