如何在这种情况下避免可变

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]); }