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