首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在调用const_cast时避免std::set<Type*>::find

在调用const_cast时避免std::set<Type*>::find
EN

Stack Overflow用户
提问于 2016-05-09 14:11:59
回答 3查看 392关注 0票数 10

有什么好的方法来消除下面的const_cast,同时保持const的正确性?

如果没有const_cast,下面的代码就不会编译。set::find获得对集合的键类型的const引用,因此在我们的示例中,它保证不更改传入的指针值;但是,它保证不更改指针指向的内容。

代码语言:javascript
运行
复制
class C {
public:
   std::set<int*> m_set;

   bool isPtrInSet(const int* ptr) const
   {
       return m_set.find(const_cast<int*>(ptr)) != m_set.end();
   }
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-09 19:01:16

在C++14中,您可以使用自己的比较器来声明int const*是透明的。这将使模板过载 of find()能够将键与任意类型进行比较。请参阅此相关的所以问题。这是乔纳森·韦克利的解释

票数 4
EN

Stack Overflow用户

发布于 2016-05-09 15:06:11

我想解释一下为什么这是不可能的基本逻辑。

假设set<int*>::find(const int*)是合法的。然后,您可以进行以下操作:

代码语言:javascript
运行
复制
set<int*> s;
const int* p_const;
// fill s and p
auto it = s.find(p_const);
int* p = *it;

嘿,普雷托!您将const int*转换为int*,而不执行const_cast

票数 1
EN

Stack Overflow用户

发布于 2016-05-09 14:19:04

有什么好的方法来消除下面的const_cast,同时保持const的正确性?

我不知道我要提出的建议是否符合“好办法”。但是,如果您不介意自己迭代集合的内容,则可以避免const_cast。请记住,这可以将O(log(N))操作转换为O(N)操作。

代码语言:javascript
运行
复制
bool isPtrInSet(const int* ptr) const
{
   for ( auto p : m_set )
   {
      if ( p == ptr )
      {
         return true;
      }
   }
   return false;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37118000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档