调用父构造函数时如何避免模板参数上的样板

How to avoid boilerplate on template arguments when calling parent constructor

假设我有一个带有很多模板参数的 class,其中之一是使用 CRTP 的派生 class:

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 作为模板参数也没关系。

首先转发声明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> {
    ....
};

只需使用派生的 class' 名称并在其中查找基础 class 名称(如果基础 class 是从属的)。如果它不依赖,您可以将基 class 命名为不合格,因为它在范围内。不需要所有模板参数

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

每个 class 都在其内部声明其名称。不仅是普通的 classes,还有 class 模板实例。所以 BaseFoo 在它自己的范围和它派生的 classes.

的范围内引用 BaseFoo<...>