在调用std :: set <type *> :: find时避免使用const_cast

时间:2016-05-09 14:11:59

标签: c++ set const const-cast

有没有什么好方法可以避免下面的const_cast,同时保持常规的正确性?

如果没有const_cast,则下面的代码无法编译。 set::find获取对set的键类型的const引用,因此在我们的例子中它保证不更改传入的指针值;但是,没有任何保证不改变指针指向的内容。

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();
   }
};

4 个答案:

答案 0 :(得分:3)

在C ++ 14中,您可以使用自己的比较器将int const*声明为透明。这将启用可以将键与任意类型进行比较的find() public void nativeMousePressed(NativeMouseEvent e) { if (!disable) { if (e.getButton() == MouseEvent.BUTTON1) { if (!randomCPS) { robotClick(cps, typeOfClick); } else if (randomCPS) { robotRandomizedBetweenClicks(fromCPS, toCPS, typeOfClick); } } } } public void nativeMouseReleased(NativeMouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { disable = true; running = false; } } 。请参阅此相关template overload。这是SO question

答案 1 :(得分:2)

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

假设set<int*>::find(const int*)是合法的。然后你可以做以下事情:

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

答案 2 :(得分:0)

如果您想存储const int*,请存储const int*。如果你想存储int*,那么就这样做,但你不能像那样混合搭配(至少,没有你已经使用的黑客)。

选择一个并坚持下去。

答案 3 :(得分:0)

  

有没有什么好方法可以避免下面的const_cast,同时保持const的正确性?

我不确定我所建议的是否属于“好方法”。但是,如果您不介意自己迭代集合的内容,则可以避免使用const_cast。请记住,这会将O(log(N))操作转换为O(N)操作。

bool isPtrInSet(const int* ptr) const
{
   for ( auto p : m_set )
   {
      if ( p == ptr )
      {
         return true;
      }
   }
   return false;
}