2

C++で次のことを実装したいと思います。

これらのタイプのいずれかのオブジェクトのペアを取る関数を呼び出す機能を備えた、単一のクラスの一連の子クラスが必要です。混合型または基本型に対して呼び出される一般的な実装と、同じ派生型の 2 つのオブジェクトが引数として使用される場合に呼び出される特殊な実装があるはずです。

私の知る限り、これは二重ディスパッチの古典的なアプリケーションです。ただし、次の制約があります。

既存のクラスから新しいクラスを派生させ、既存のクラスを変更せずに、これらの新しいクラスに新しいペア関数を追加することが可能でなければなりません。たとえば、外部ライブラリ..

前回の質問で提案したアプローチには誤りがあり、そこで提案された解決策は、基本クラスが作成された時点で既知の型に対してのみ機能します。

これを実装する方法について何か提案はありますか? それは可能ですか?

更新: コードは 1000 語以上を語ります。次のアプローチが機能します。

#include <iostream>

class B;

class A
{
public:
  virtual void PostCompose(A* other)
    {
      other->PreCompose(this);
    }
  virtual void PreCompose(A* other)
    {
      std::cout << "Precomposing with an A object" << std::endl;
    }
  virtual void PreCompose(B* other);
};

class B : public A
{
public:
  using A::PreCompose;
  virtual void PostCompose(A* other)
    {
      other->PreCompose(this);
    }
  virtual void PostCompose(B* other)
    {
      other->PreCompose(this);
    }
  virtual void PreCompose(B* other)
    {
      std::cout << "Precomposing with a B object" << std::endl;
    }
};

void A::PreCompose(B* other)
  {
    PreCompose((A*)other);
  }

int main()
{
  B b;
  A* p = &b;
  p->PostCompose(p); // -> "Precomposing with a B object"
}

Bただし、実装する際には の知識が必要Aです。より良い方法はありますか?

4

1 に答える 1

1

派生クラスは、パラメーターの型がオブジェクトの型と一致するかどうかを検出するだけでよいため、簡単なチェックを使用できます。

virtual void foo( base *argument_base ) {
    if ( derived *argument = dynamic_cast< derived * >( argument_base ) ) {
        argument->something = pair_match_foo;
    } else {
        base_class::foo( argument_base );
    }
}
于 2011-04-14T12:51:39.290 に答える