有没有什么好方法可以避免下面的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();
}
};
答案 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;
}