Множество аспектов специализации шаблонного класса

контекст

В настоящее время я пишу некоторый Аспектно-ориентированный код на 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 внутри аргумента класса шаблона.

Спасибо за ваши предложения!

0

Решение

Вы не можете, единственный способ быть уверенным, если тип Aspect1<DerivedA> используется. Если он используется, он будет скомпилирован, иначе нет.

0

Другие решения

Других решений пока нет …