環境
現在、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
私の質問
Aspect1
forの特殊化が、テンプレート パラメーターとして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_of
かboost::enable_if
?
本文でいくつか使用できると思いtypedef DerivedA AspectBase;
ましたが、テンプレート クラス引数内の typedef に対してテンプレート クラスDerivedA
を特殊化する方法がわかりません。Aspect1
あなたの提案をありがとう!