在这种情况下如何避免可变
How to avoid mutable in this case
考虑一下:
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 向量获取指向非常量的指针的最佳方法是什么?
我要解决的问题如下:
我有一些代码看起来像这样(抱歉不能 post 完整的代码):
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; }
};
因为这是我可以在不破坏(很多)现有代码的情况下做的事情。我可以完全放弃常量性,这可能是一个更好的设计,但如果可能的话我想避免这种情况,因为那样我必须在其他地方修复问题。
我们对编译器使用的一个老技巧,前一段时间没有实现 mutable
是 const_cast
去掉 this
对象的常量,比如:
void foo () const { xp = &( (const_cast<Foo*>(this)->x)[0]); }
也非常适合您的情况。
考虑一下:
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 向量获取指向非常量的指针的最佳方法是什么?
我要解决的问题如下:
我有一些代码看起来像这样(抱歉不能 post 完整的代码):
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; }
};
因为这是我可以在不破坏(很多)现有代码的情况下做的事情。我可以完全放弃常量性,这可能是一个更好的设计,但如果可能的话我想避免这种情况,因为那样我必须在其他地方修复问题。
我们对编译器使用的一个老技巧,前一段时间没有实现 mutable
是 const_cast
去掉 this
对象的常量,比如:
void foo () const { xp = &( (const_cast<Foo*>(this)->x)[0]); }
也非常适合您的情况。