如何在这种情况下避免可变
How to avoid mutable in this case
本文关键字:这种情况下 更新时间:2023-10-16
考虑一下:
struct Foo {
std::vector<double> x;
mutable double* xp;
void foo () const { xp = &(x[0]); }
};
不能用because of编译error: invalid conversion from 'const double*' to 'double*' [-fpermissive]
修复方法很简单:
struct Foo {
mutable std::vector<double> x;
mutable double* xp;
void foo () const { xp = &(x[0]); }
};
但是如果我不想让向量可变呢?在这种情况下,从const向量获得指向非const的指针的最佳方法是什么?
我想解决的问题如下:
我有一些代码看起来像这样(抱歉不能发布完整的代码):
struct Foo {
mutable DataSource data;
void load(int index) const { data->GetEntry(index); }
void getX() const { return data->element->x; }
};
我不能改变DataSource
,它的GetEntry
从文件中读取以更新它的element
。以这种方式读取文件很慢,因此我想将其更改为
struct Foo {
mutable DataSource data;
std::vector<DataSource::Element> elements;
DataSource::Element* current;
void loadAll() { /*... read all elements into the vector ...*/ }
void load(int index) const { current = &(elements[index]); }
void getX() const { return current->x; }
};
,因为我可以在不破坏(大量)现有代码的情况下这样做。我可以完全去掉constness,这可能是一个更好的设计,但如果可能的话,我希望避免那样,因为那样我就必须在其他地方修复一些东西
对于之前没有实现mutable
的编译器,我们使用的一个老技巧是将const_cast
去掉this
对象的constness,如:
void foo () const { xp = &( (const_cast<Foo*>(this)->x)[0]); }
相关文章:
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 在这种情况下,java对象是否可以调用本机函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 在这种情况下,如何传递成员函数而不是函数?
- 为什么在这种情况下递增阵列名称有效?
- 在这种情况下我应该使用哪种设计模式
- 为什么在这种情况下我需要 .template
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 在这种情况下,"typename..."意味着什么?
- 为什么在这种情况下 x = 44?
- 在这种情况下是私有的吗?试图使操作员<<过载
- 在这种情况下,如何防止C++输出/控制台窗体关闭
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 为什么在这种情况下,前向声明不起作用?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在这种情况下,为什么模板即时深度超过限制?
- 在这种情况下,当尝试从单独的类更新变量时,我是否需要使用指针?