我想更改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结构上工作。
答案 0 :(得分:5)
您有两种选择:
const_cast <> ()
mutable
但是,因为你想更新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几乎总是一个糟糕设计的标志。