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

ale*_*dia 4 c++ templates boilerplate crtp

所以假设我有一个包含很多模板参数的类,其中一个是使用CRTP的派生类:

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

我想继承它:

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

是否有任何技巧可以避免所有明确的模板参数提及?

如果我仍然需要声明Derived为模板参数,那就没关系了.

Joh*_*itb 6

如果基类是依赖的,只需使用派生类的名称并在其中查找基类名称.如果它不依赖,则可以将基类命名为不合格,因为它在范围内.不需要所有模板参数

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

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


Dan*_*ite 5

首先向前宣布DerivedFoo.

class DerivedFoo;
Run Code Online (Sandbox Code Playgroud)

然后 typedef

typedef BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec> OtherFoo;
Run Code Online (Sandbox Code Playgroud)

也有可能 using

using OtherFoo = BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec>;
Run Code Online (Sandbox Code Playgroud)

或者如果你不在乎不必提及 Derived

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

class DerivedFoo : public OtherFoo<DerivedFoo> {
    ....
};
Run Code Online (Sandbox Code Playgroud)