考虑一下:
struct Foo {
std::vector<double> x;
mutable double* xp;
void foo () const { xp = &(x[0]); }
};
这不会因为而编译
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; }
};
因为在不破坏(大量)现有代码的情况下,我就能做到这一点。我可以删除常量,这可能是一个更好的设计,但如果可能的话我想避免这种情况,因为那时我必须在其他地方解决问题。
答案 0 :(得分:-1)
我们用于编译器的一个旧技巧是在mutable
对象的const_cast
远离this
对象的常量,例如:
void foo () const { xp = &( (const_cast<Foo*>(this)->x)[0]); }
也适合您的情况。