有什么好的方法来消除下面的const_cast,同时保持const的正确性?
如果没有const_cast,下面的代码就不会编译。set::find获得对集合的键类型的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();
}
};发布于 2016-05-09 19:01:16
是。
在C++14中,您可以使用自己的比较器来声明int const*是透明的。这将使模板过载 of find()能够将键与任意类型进行比较。请参阅此相关的所以问题。这是乔纳森·韦克利的解释。
发布于 2016-05-09 15:06:11
我想解释一下为什么这是不可能的基本逻辑。
假设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。
发布于 2016-05-09 14:19:04
有什么好的方法来消除下面的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;
}https://stackoverflow.com/questions/37118000
复制相似问题