C++ CRTP с параметризованным базовым классом?

Я пытаюсь использовать CRTP с небольшим изменением. У меня есть один шаблон производного класса, и я хочу применить его к нескольким базовым классам. Но это либо невозможно, либо я просто не могу понять правильный синтаксис. Следующий код не компилируется, но, надеюсь, иллюстрирует, чего я хочу достичь:

template <class Derived> struct BaseCats { /* ... */ };
template <class Derived> struct BaseDogs { /* ... */ };
// ....
template <class Derived> struct BaseN { /* ... */ };

template <template <class> class Base>
struct Wrapper 
    : 
    Base<Wrapper> // compile error - Wrapper is not a complete type
{
    Wrapper(int n) 
    { 
       // I do not want to rewrite or forward this 
       // constructor or Wrapper's operators
    }
};

typedef Wrapper<BaseCats> Cats;
typedef Wrapper<BaseDogs> Dogs;
// ...
typedef Wrapper<BaseN> MyTypeN;

Можно ли это сделать?

Редактировать:

Чего я пытаюсь достичь здесь?

Я переименовал часть кода выше, чтобы использовать метафору "собаки и кошки". Могут существовать такие функции, как:

void BaseCats<Derived>::print() const 
{ 
    std::cout << (static_cast<const Derived *>this)->n << " cats\n"; 
}

Но Wrapper будет содержать конструкторы и операторы, которые являются общими для собак и кошек. Вид перевернутого полиморфизма, где базовый класс имеет специализации. Причина, по которой все происходит наоборот, заключается в том, что конструкторы и операторы не нужно переписывать или пересылать для каждой специализации.

1 ответ

Решение

Ваша ошибка компиляции может быть решена этим:

Base<Wrapper<Base> >

Вы забыли аргументы шаблона.

Другие вопросы по тегам