初始化 C++ 基类而不键入整个基类类型两次

Posted

技术标签:

【中文标题】初始化 C++ 基类而不键入整个基类类型两次【英文标题】:Initialise C++ base class without typing whole base class type twice 【发布时间】:2020-07-18 07:53:15 【问题描述】:

我正在寻找一种可以避免某些代码复制的 C++ 模式或技术。

我将empty base optimisation 用于某些算法。 当我从具有详细模板参数的类继承时,必须在 member initializer list 中输入相同的详细类型并作为类的基类是很麻烦的。

一个人为的例子:

template <uint32_t Port, uint32_t Pin>
class Pin;

-

template <typename T>
struct ActiveHigh;

template <uint32_t Port, uint32_t Pin>
struct ActiveHigh : Pin<Port, Pin> // <-- First entry.

    ActiveHigh() : Pin<Port, Pin> false   // <-- Duplicate entry.
;

我正在编写一个 C++ linter,它有一个真正应该利用 empty base optimisation 的特性。由于这种模式,实际上有数千行重复条目。 有没有人有一种模式可以用来克服这种代码异味?

编辑 1

This is what I have 到目前为止,但在每次实例化时都必须写 typename 有点糟糕。

【问题讨论】:

【参考方案1】:

您可以执行以下解决方法:

template <uint32_t PortT,
          uint32_t PinT,
          typename ActualPin = Pin<PortT, PinT>>
struct ActiveHigh : ActualPin

    ActiveHigh() : ActualPin false  
;

【讨论】:

我有时会这样做,很好的建议。但是,它不适用于可变参数,并且如果您使用 ActualPin 对 ActiveHigh 类进行部分特化,它也不起作用。 这是这种模式的问题与部分专业化godbolt.org/z/UY3by- @DavidLedger 啊,我明白了。我会考虑另一种方法,但会在此处留下这个答案,以防其他人考虑我提供的相同解决方案 当然,我确实喜欢这种模式,它是我在一些有限情况下找到的最好的模式。这是可变参数godbolt.org/z/SUdsf7的问题

以上是关于初始化 C++ 基类而不键入整个基类类型两次的主要内容,如果未能解决你的问题,请参考以下文章

C++虚基类初始化

初始化基类成员的首选方法 (c++)

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

关于C++基类与派生类

使用派生 [C++] 生成的参数初始化基类

C++如何初始化抽象基类引用元素?