gpt4 book ai didi

c++ - 如何编写 Const 和 Mutable 重载?

转载 作者:搜寻专家 更新时间:2023-10-31 00:23:25 25 4
gpt4 key购买 nike

我的代码中似乎经常出现这种模式,除了参数/返回值的常量性之外,两个函数执行相同的任务。

int& myClass::getData()
{
return data;
}

// called for const objects
const int& myData::getData() const
{
return data;
}

这冒犯了我对 DRY 的看法。对于单行代码来说这不是问题,但随着 getData() 变大,就会出现明显的重复。

我知道为什么我需要这两种方法,但我觉得应该有更好的方法来实现它。是否有可以提供帮助的模板技巧,或者我是否应该使用一种方法来调用另一种方法来根据需要来回转换常量?

添加:作为一个更真实的例子,这里有一个典型的 STL vector::at() 实现的例子:

const_reference at(size_type _Off) const
{ // subscript nonmutable sequence with checking
if (size() <= _Off)
_Xran();
return (*(begin() + _Off));
}

reference at(size_type _Off)
{ // subscript mutable sequence with checking
if (size() <= _Off)
_Xran();
return (*(begin() + _Off));
}

最佳答案

使用以下技巧(我最初是从 Scott Meyers 的书 Effective C++ 中得到的):

int& myClass::getData()
{
// This is safe because we know from out here
// that the return value isn't really const
return const_cast<int&>(const_cast<const myClass&>(*this).getData());
}

const int& myData::getData() const
{
return data;
}

显然,对于像这样的短函数,您可能会发现复制代码更容易,但是当您有更长的函数(如 vector<T>::at 或需要进行大量更改)时,这个惯用语很有用。

关于c++ - 如何编写 Const 和 Mutable 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com