与数据成员指针和可变字段一起工作

问题描述 投票:0回答:1

我有一个自定义容器类,从用于更新状态的项目类型中获取数据成员指针。由于关联的字段不被视为该项目状态的一部分,需要在不突变项目的各种上下文中修改,因此已建立的设计是制作此类字段

mutable
,允许在const上下文中进行更新。

struct ContainerStatus {}; struct ContainerItem { mutable ContainerStatus status; }; template <typename T> class Container { public: Container(ContainerStatus T::*statusField) : m_statusField(statusField) { } void push_back(T* ptr) { // Allocate and move the pointer... // Update the status of the pointed item // T may be const as part of a const container } private: ContainerStatus T::*m_statusField; };
whow,当涉及到更新状态时,数据成员指针认为该字段是不可变的,只能在非const项目上修改,我被迫在const Contect中更新状态。
const_cast

除非该领域是可变形的,否则这似乎不是很优雅,而且从技术上讲也不是const正确的,没有编译时的保障。因此,我想知道是否有某种方法可以注释数据成员指示,以指示它应该指向一个可变的字段。
    

当您可以使用会员函数指针而不是成员指针时,您可以避免施放铸件:

const T& item = ...; item.*status = ...; // Error const_cast<T&>(item).*status = ...; // OR const_cast<ContainerStatus&>(item.*status) = ...;

c++ c++20
1个回答
0
投票
struct ContainerStatus { int value = 42; }; struct ContainerItem { mutable ContainerStatus status; ContainerStatus& get_status() const { return status; } }; template <typename T> class Container { public: Container(ContainerStatus& (T::*getter)()const) { const T t; (t.*getter)().value = 1; } }; int main() { Container<ContainerItem> c{&ContainerItem::get_status}; }

。 livedemo

    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.