调用父构造函数时如何避免模板参数上的样板
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<...>
假设我有一个带有很多模板参数的 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<...>