gpt4 book ai didi

c++ - 如何避免在 volatile 类中重复方法

转载 作者:行者123 更新时间:2023-12-05 09:25:53 25 4
gpt4 key购买 nike

假设我有以下非常简单的类:

class A
{
public:
static constexpr A make() { return A{}; }

constexpr A() : _v(0) {}

constexpr A& setV(int v) { _v = v; return *this; }

private:
int _v;
};

如果我尝试按如下方式使用它:

int main()
{
volatile A a1;
a1.setV(10);

//OR

//The optimizer will optimize this chain of constexpr calls into a single "store" instruction
a1 = A::make().setV(10); //More chaining here

return 0;
}

代码不会编译。

我理解为什么这是真的基于:Defining volatile class object

我知道解决方案是添加一个额外的方法,如下所示:

class A
{
public:
constexpr A() : _v(0) {}

volatile A& setV(int v) volatile { _v = v; return *this; }
constepxr A& setV(int v) { _v = v; return *this; }

private:
int _v;
};

顺便说一句,我知道返回 volatile 引用会在未使用时发出警告。

我的问题是,在这种情况下,有什么方法可以避免代码重复? setV 的两种实现将始终相同。因此,如果我添加/更改更多方法,我必须同时维护它们,如果它们不是那么琐碎的话,这可能会变得困惑。唯一的区别是类型限定符之一......

由于在评论中提到了这一点,我想我会注意到我在这里需要 volatile 因为我试图最终为嵌入式系统上的硬件外围寄存器访问实现“类覆盖”。

最佳答案

在 C++23 中,您可以使用 explicit object parameter (也称为 deducing this)用于此目的:

class A
{
public:
A() : _v(0) {}
template <class Self>
constexpr auto&& setV(this Self&& self, int v) {
self._v = v; return self;
}
private:
int _v;
};

不幸的是,在撰写本文时,唯一支持此功能的编译器是最新版本的 Microsoft Visual C++。

关于c++ - 如何避免在 volatile 类中重复方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74804177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com