2

メソッドテンプレートを持つクラスがあります:

struct Subject
{
  template <typename T>
  void doSomething()
  {
    ..
  }
};

doSomethingが( any で)呼び出されるたびTに、「オブザーバー」に通知したいと思います:

  template <typename T>
  void onDoSomething()
  {
    ..
  }

オブザーバーがメソッド テンプレートであることが重要です (メソッドが含まれるクラス テンプレートも同様に機能します)。そうでない場合は、一般的なオブザーバー パターンを実装するだけで済みます。

Subject::doSomething()メソッドを呼び出すように変更しても問題ありません。ただし、クラスSubjectは具体的な Observer/observer メソッドを「認識」してはなりません。

この背後にある考え方は次のとおりです。私Subjectは 2 つのプロジェクトで使用しています。オブザーバーはそのうちの1つだけに必要です(そして持っています)。

これを達成する方法はありますか?

4

2 に答える 2

2

難しいもの。に要約されるようです

通知はコンパイル時に解決可能でなければなりません (これはテンプレートです)

同時に、

通知はコンパイル時に解決可能であってはなりSubjectません (オブザーバーを認識してはなりません)

私はそれを行う2つの方法を考えることができます:


1.次のオーバーロードを追加しdoSomethingます。

template <typename T, typename Observer>
void doSomething()
{
  doSomething<T>();
  Observer::onDoSomething<T>();
}

次に、プロジェクト A で 1 パラメーター バージョンを呼び出し、プロジェクト B で 2 パラメーター バージョンを呼び出します。


2.定義するファイルSubjectに、各プロジェクトで異なる/異なる構成のヘッダーを含めます。

Subject.h

#include "observer_def.hpp"

struct Subject
{
  template <typename T>
  void doSomething()
  {
    ..
    notifyDoSomething<T>();
  }
};

プロジェクト A のobserver_def.hpp :

template <typename>
inline void notifyDoSomething() {}

プロジェクト B のobserver_def.hpp :

template <typename T>
inline void notifyDoSomething()
{
  MyObserver::onDoSomething<T>();
}
于 2013-04-04T10:24:51.980 に答える