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超过DerivedADerivedB)我有以下专业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;DerivedA正文中使用一些,但我看不到如何Aspect1在模板类参数中通过 typedef 专门化模板类。

感谢您的建议!

4

1 回答 1

0

您不能,唯一可以确定的方法是是否Aspect1<DerivedA>使用了该类型。如果使用,则编译,否则不编译。

于 2013-03-24T15:41:18.693 回答