语境
我目前正在用 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;
在DerivedA
正文中使用一些,但我看不到如何Aspect1
在模板类参数中通过 typedef 专门化模板类。
感谢您的建议!