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

时间:2016-07-05 12:41:49

标签: c++ vector const mutable

考虑一下:

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

因为在不破坏(大量)现有代码的情况下,我就能做到这一点。我可以删除常量,这可能是一个更好的设计,但如果可能的话我想避免这种情况,因为那时我必须在其他地方解决问题。

1 个答案:

答案 0 :(得分:-1)

我们用于编译器的一个旧技巧是在mutable对象的const_cast远离this对象的常量,例如:

void foo () const { xp = &( (const_cast<Foo*>(this)->x)[0]); }    

也适合您的情况。