Как избежать шаблонов аргументов шаблона при вызове родительского конструктора

Допустим, у меня есть класс с большим количеством аргументов шаблона, одним из которых является производный класс для использования CRTP:

template <typename Derived, typename A, typename B, typename C, typename D>
class BaseFoo  {
public:
BaseFoo(A& a) {}
};

И я хочу унаследовать это:

class DerivedFoo : public BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec> {
public:
DerivedFoo(A& a) : BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec>(a) {}
};

Есть ли хитрость, чтобы избежать всех явных упоминаний аргументов шаблона?

Это нормально, если я все еще должен заявить Derived в качестве аргументов шаблона.

4

Решение

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

class DerivedFoo : public BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec> {
public:
DerivedFoo(A& a) : BaseFoo(a) {}
};

Каждый класс объявляет свое имя внутри себя. Не только обычные классы, но и экземпляры шаблонов классов. Так BaseFoo относится к BaseFoo<...> в своей области видимости и области его производных классов.

6

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

Первый форвард объявляет DerivedFoo,

class DerivedFoo;

затем typedef

typedef BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec> OtherFoo;

также возможно с using

using OtherFoo = BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec>;

или если вам не нужно упоминать Derived

template <typename Derived>
using OtherFoo = BaseFoo<Derived, Bc, Cc, Dc, Ec>;

class DerivedFoo : public OtherFoo<DerivedFoo> {
....
};
5

По вопросам рекламы [email protected]