初始化 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++ 基类而不键入整个基类类型两次的主要内容,如果未能解决你的问题,请参考以下文章