有没有办法更改const结构的成员?

时间:2011-09-19 10:58:32

标签: c++ const

我想更改const函数参数的成员。想象一下我正在处理的纹理类中的这个片段:

template<>
void mySuperTexture::loadPixels<float>(uint32 _width, uint32 _height, float * _pixels, const Settings & _settings)
{
    if (_settings.pixelDataType == PixelDataType::Auto) {
       _settings.pixelDataType = PixelDataType::Float32;
       // ^ obviously this does not work on the const variable
    }
    // ...
    m_pimpl->loadPixels(_width, _height, _pixels, _settings);
}

我知道我可以使参数非 - const,但这不允许我为settings参数指定默认参数,或者用temp变量调用函数。

我想我可以在loadPixels函数中制作一个Settings struct的副本,但我想避免这种情况。还有其他想法吗?

修改

好吧,我决定使用mutable关键字.-这就是为什么:在我的场景中,Settings结构基本上只在构造像素的纹理/加载时使用,之后不存储.-因此{{{ 1}}不会改变用户的constness,因为它根本无法访问。因为我正在为各种类型实现loadPixels方法(即unsigned char,short,int ......),所以重载似乎更像是一种痛苦,因此只是重载会增加源代码的数量很多。顺便说一句。实际设置保存在 pimpl 对象(其loadPixel函数未模板化,因此不知道任何类型)中,这就是为什么我想直接在const Settings结构上工作。

3 个答案:

答案 0 :(得分:5)

您有两种选择:

  1. 执行const_cast <> ()
  2. 将该成员标记为mutable
  3. 但是,因为你想更新const-y和非consty的东西,我想你想用非const版本重载函数:

    template<>
    void mySuperTexture::loadPixels<float>(uint32 _width, uint32 _height, float * _pixels, Settings & _settings)
    

    然后将公共代码放入另一个函数中。

答案 1 :(得分:4)

我不清楚为什么要修改设置参数。

int pixelDataType = _settings.pixelDataType;
if (pixelDataType == PixelDataType::Auto) {
   pixelDataType = PixelDataType::Float32;
}

其他建议似乎听起来不合适。为了修改const对象而抛弃constness会导致未定义的行为。同样,将完全普通的数据成员变为可变也不是一个好主意,因为它会使const关键字失去其大部分价值。

如果要避免复制但存储引用/指针设置,这不是一个好主意,因为Settings对象的生命周期很容易短于纹理对象。制作副本会在这里提供最强大的代码。

作为替代方案,您可以完全摆脱PixelDataType::Auto,并Settings将此成员初始化为Float32本身(例如默认情况下)。

答案 2 :(得分:0)

如果你真的知道自己在做什么,你可以将常量抛弃(参见http://www.cplusplus.com/doc/tutorial/typecasting/),但使用const cast几乎总是一个糟糕设计的标志。