调用基类构造函数而不命名它的类

call base class constructor without naming its class

本文关键字:基类 构造函数 调用      更新时间:2023-10-16
class MyDerived: public Incredble<Difficult< And<Complicated, Long>>, And<Even, Longer>, BaseClass, Name>
{
public:
  MyDerived();
}

MyDerived::MyDerived
: ???(params)
{}

有没有一种方法可以调用基构造函数而不写它的全名和不定义它的类型?

原因很明显是为了避免代码重复,并在基类模板参数中的一个细节发生变化时引入多个位置进行更改。

第2级:

template <uint32 C>
class MyDerived: public Incredble<Difficult< And<Complicated, Long>>, And<Even, Longer>, BaseClass, Name>
{
public:
  MyDerived();
}
template <uint32 C>
MyDerived::MyDerived<C> 
: ???(C)
{
}

你可以使用inject -class-nameIncredible<...>::Incredible引用自身,由于MyDerived不是类模板,因此不限定查找将在其基类的范围内查找:

MyDerived::MyDerived
: Incredble(params)
{}

如果Incredible是与相关的名称,则需要对其进行限定。实际上,您可以简单地使用派生类型名称来限定基类的inject -class-name (h/t Johannes Schaub-litb):

MyDerived::MyDerived
: MyDerived::Incredible(params)
{}

这将在所有情况下工作。

如果您不想使用usingtypedef来避免"污染封闭的命名空间",您可以在类/结构中使用using

一个例子
#include <map>
template <typename ...>
class foo
 {};
struct A : public foo<int, std::tuple<long, char, std::map<std::string, int>>>
 {
   using base_t = foo<int, std::tuple<long, char, std::map<std::string, int>>>;
   A () : base_t{}
    { };
 };
int main()
 { }