如何编码Const和Mutable重载?

时间:2010-01-20 22:44:02

标签: c++ const

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

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

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

这冒犯了我的DRY感。对于单行程序来说这不是问题,但随着getData()变大,显然会出现重复。

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

ADDED:作为一个更真实的例子,这是典型的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));
    }

3 个答案:

答案 0 :(得分:3)

使用以下技巧(我最初从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或者需要进行大量更改),这个习惯用法很有用。 p>

答案 1 :(得分:2)

提供如下功能:

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

可能是错误的 - 您也可以公开'数据'。第二个应该写成:

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

答案 2 :(得分:1)

您引用的标准库函数重复代码的原因是标准库函数需要尽可能高效。在那里调用另一个函数(正如其他人正确建议的那样)可能会搞砸了。但是你的代码可能在不那么严格的性能限制下,所以你应该尽可能使用通用代码。