我有以下使用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;
}
答案 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));
}
强制性修改:无论如何,locate
应该有两个版本,可以说明const
- ness。我上面的解决方案只是一种避免重复代码的方法,实际上是丑陋的。
答案 1 :(得分:1)
基本上,你不能(虽然你可以强制const_cast
,但你不应该)。
确保常量locate
也应该是const
或SegmentNode::find
不应该是常量。为了帮助你,问问自己,如果locate
从不改变任何东西,为什么@RequestMapping(value = "/{name:^(?!api).+}", method = RequestMethod.GET)
不是常量?
选择更适合您案例的内容。