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为模板参数,那就没关系了.
如果基类是依赖的,只需使用派生类的名称并在其中查找基类名称.如果它不依赖,则可以将基类命名为不合格,因为它在范围内.不需要所有模板参数
class DerivedFoo : public BaseFoo<DerivedFoo, Bc, Cc, Dc, Ec> {
public:
DerivedFoo(A& a) : BaseFoo(a) {}
};
Run Code Online (Sandbox Code Playgroud)
每个类都在其内部声明其名称.不仅是普通类,还有类模板实例.所以BaseFoo指的是BaseFoo<...>它自己的范围和派生类的范围.
首先向前宣布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)