如何在const函数中使用非const函数?

时间:2017-06-22 19:20:30

标签: c++11

我有以下使用non-const函数locate的{​​{1}}函数。 locate不能const,因为它可能会返回对*this的引用,但它永远不会更改this中的任何内容。我希望能够致电locate以便我不会复制代码,那么在这种情况下使用此non-const功能的正确方法是什么?

正如您所看到的,我甚至将locate const的结果生成,但这并不能保证我不会在locate内更改某些内容。那么有一种方法可以使函数暂时保持不变吗?

bool SegmentNode::find(const Segment& ss) const {
    const SegmentNode& parent = locate(ss);
    for (Segment in : parent.overlap_beg()) {
        if (ss == in)
            return true;
    }
    return false;
}

2 个答案:

答案 0 :(得分:2)

解决方案是有两个locate函数:一个是const而另一个不是。您将在非const版本中使用const_cast,并且生成的代码是合法的,因为SegmentNode的入口点是非const。

const SegmentNode& SegmentNode::locate(const Segment& s) const{
  // as you have it already
  return* this;
}

SegmentNode& SegmentNode::locate(const Segment& s){
  return const_cast<SegmentNode&>(static_cast<const SegmentNode*>(this)->locate(s));
}

Demo

强制性修改:无论如何,locate应该有两个版本,可以说明const - ness。我上面的解决方案只是一种避免重复代码的方法,实际上是丑陋的。

答案 1 :(得分:1)

基本上,你不能(虽然你可以强制const_cast,但你不应该)。

确保常量locate也应该是constSegmentNode::find不应该是常量。为了帮助你,问问自己,如果locate从不改变任何东西,为什么@RequestMapping(value = "/{name:^(?!api).+}", method = RequestMethod.GET) 不是常量?

选择更适合您案例的内容。