C++11 如何在常量函数中使用非常量函数?

C++11 如何在常量函数中使用非常量函数?,c++11,C++11,我有以下const函数,它使用non-const函数locate定位不能是常量,因为它可能返回对*此的引用,但它不会更改此中的任何内容。我希望能够调用locate,这样我就不会复制代码,那么在这种情况下,使用此non-const函数的正确方法是什么 如您所见,我甚至生成了locateaconst的结果,但这并不保证我不会从locate中更改某些内容。那么,有没有一种方法可以使函数暂时保持不变呢 bool SegmentNode::find(const Segment& ss) const

我有以下
const
函数,它使用
non-const
函数
locate
<代码>定位不能是
常量
,因为它可能返回对
*此
的引用,但它不会更改
中的任何内容。我希望能够调用
locate
,这样我就不会复制代码,那么在这种情况下,使用此
non-const
函数的正确方法是什么

如您所见,我甚至生成了
locate
a
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;
}
基本上,您不能(虽然您可以强制执行
const\u cast
,但您不应该)

为确保常量的正确性,
locate
也应为
const
SegmentNode::find
不应为常量。为了帮助您,问问自己,如果
locate
从未改变任何东西,为什么它不是const

选择更适合你的情况

基本上,你不能(尽管你可以强制执行
const\u cast
,但你不应该)

为确保常量的正确性,
locate
也应为
const
SegmentNode::find
不应为常量。为了帮助您,问问自己,如果
locate
从未改变任何东西,为什么它不是const


选择更适合你的情况

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

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));
}
const SegmentNode&SegmentNode::locate(const Segment&s)const{
//你已经有了
归还*这个;
}
分段节点和分段节点::定位(常量分段和s){
返回常量转换(静态转换(this)->定位);
}

强制编辑:应该有两个版本的
locate
来解释
const
-ness。我上面提到的解决方案只是一种避免重复代码的方法,虽然代码很难看。

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

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));
}
const SegmentNode&SegmentNode::locate(const Segment&s)const{
//你已经有了
归还*这个;
}
分段节点和分段节点::定位(常量分段和s){
返回常量转换(静态转换(this)->定位);
}

强制编辑:应该有两个版本的
locate
来解释
const
-ness。我上面提到的解决方案只是一种避免重复代码的方法,虽然代码很难看。

只需使用常量和非常量版本重复定位即可。如果您不想重复代码,可以从这里使用解决方案:@LoPiTaL,谢谢,我喜欢这个解决方案只需使用常量和非常量版本复制定位。如果你不想重复代码,你可以从这里使用解决方案:@LoPiTaL,谢谢,我喜欢这个解决方案谢谢,这是@LoPiTaL首先提出的,所以我想感谢他的建议。但这确实是我决定要做的。@jdodle:当L'Hospital发表评论时,我正在准备我的答案:-)没问题!很高兴知道它很有用。谢谢,这是@LoPiTaL首先提出的,所以我想感谢他的建议。但这确实是我决定要做的。@jdodle:当L'Hospital发表评论时,我正在准备我的答案:-)没问题!很高兴知道它有用。