0

環境

現在、C++ でアスペクト指向のコードを書いています。私は次のクラス階層を持っています:

class Base                   { virtual void doSmth() {/* generic stuff */ } };
class DerivedA : public Base { virtual void doSmth() {/* specific DerivedA stuff */} };
class DerivedB : public Base { virtual void doSmth() {/* specific DerivedB stuff */} };

上記のクラスにいくつかの機能を追加するために、いくつかのアスペクト クラスを定義しました。

template <class I>
class Aspect1 : public I
{
  void doSmth() { I::doSmth(); doSmthMore(); }
  void doSmthMore() { /* do something specific to Aspect1 */ }
};


template <class I>
class Aspect2 : public I
{
  void doSmth() { I::doSmth(); doSmthMore(); }
  void doSmthMore() { /* do something specific to Aspect2 */ }
};

特定のケース (Aspect1以上DerivedAおよびDerivedB) では、次の専門分野がありAspect1ます。

template <>
class Aspect1< DerivedA > : public DerivedA
{
  void doSmth() { I::doSmth(); doSmthMore(); doSmthMoreA(); }
  void doSmthMore()  { /* do something specific to Aspect1 */ }
  void doSmthMoreA() { /* do something specific to Aspect1 for DerivedA*/ }
};
// Idem for Aspect1//DerivedB

私の質問

Aspect1forの特殊化が、テンプレート パラメーターとしてDerivedA入力してもコンパイルされることを確認するにはどうすればよいですか?Aspect2<DerivedA>

つまり、構成ファイルで:

typedef Aspect2<Aspect1<DerivedA> > > ClassToBeUsed; // This is OK

typedef Aspect1<Aspect2<DerivedA> > > ClassToBeUsed; // This is not (Aspect1 specialization for DerivedA is not compiled)

DerivedA から派生したクラスが特殊化 Aspect1 を使用している可能性があります。それを行う方法はありますboost::is_base_ofboost::enable_if

本文でいくつか使用できると思いtypedef DerivedA AspectBase;ましたが、テンプレート クラス引数内の typedef に対してテンプレート クラスDerivedAを特殊化する方法がわかりません。Aspect1

あなたの提案をありがとう!

4

1 に答える 1

0

できません。確実にできる唯一の方法は、型Aspect1<DerivedA>が使用されているかどうかです。使用された場合はコンパイルされますが、そうでない場合はコンパイルされません。

于 2013-03-24T15:41:18.693 に答える