контекст
В настоящее время я пишу некоторый Аспектно-ориентированный код на 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
скажем, 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 внутри аргумента класса шаблона.
Спасибо за ваши предложения!
Вы не можете, единственный способ быть уверенным, если тип Aspect1<DerivedA>
используется. Если он используется, он будет скомпилирован, иначе нет.
Других решений пока нет …