Допустим, у меня есть класс с большим количеством аргументов шаблона, одним из которых является производный класс для использования 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
в качестве аргументов шаблона.
Просто используйте имя производного класса и найдите в нем имя базового класса, если базовый класс является зависимым. Если он не зависит, вы можете просто назвать базовый класс неквалифицированным, поскольку он находится в области видимости. Нет необходимости во всех аргументах шаблона
class DerivedFoo : public BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec> {
public:
DerivedFoo(A& a) : BaseFoo(a) {}
};
Каждый класс объявляет свое имя внутри себя. Не только обычные классы, но и экземпляры шаблонов классов. Так BaseFoo
относится к BaseFoo<...>
в своей области видимости и области его производных классов.
Первый форвард объявляет 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> {
....
};