从const调用nonconst成员版本

Yol*_*ola 5 c++ overloading const

可能重复:
如何删除类似const和非const成员函数之间的代码重复?

我有两个成员

A &B::GetA (int i)
{
    return *(m_C[m_AtoC[i]]);
}

const A &B::GetA (int i) const
{
    return *(m_C[m_AtoC[i]]);
}
Run Code Online (Sandbox Code Playgroud)

现在我只是重复代码,但可能存在很好的方法来做到这一点.我绝对不想处理从const到非const的类型转换.

编辑:所以我想打电话给另一个成员,以避免代码重复.

Ker*_* SB 2

[注意更正;抱歉一开始弄错了。]

这是使用 a 的合适情况const_cast,它允许您通过将调用从非常量函数转发到相应的 const 函数来消除重复代码:

A & B::GetA(int index) 
{
    return const_cast<A &>(static_cast<B const *>(this)->GetA(index));
}
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,这应该只在一个方向上完成:您可以non-const根据常量来实现该方法,但反之则不然:常量调用GetA()获取对所讨论对象的常量引用,但由于我们如果有额外的信息表明改变对象实际上是可以的,我们就可以安全地从结果中抛弃常量性。

Scott Meyer 的《Effective C++》中甚至有一章专门介绍了这种技术。

  • @KerrekSB除了在“B const”的实例上执行时您的强制转换定义不明确。反过来做,在非“const”版本中进行“const”强制转换。 (2认同)
  • @Konrad const-casting(即玩弄*类型*)不是UB。 (2认同)