[英]Can't pass 'const pointer const' to const ref
假设你有一组指针(是的......):
std::set<SomeType*> myTypeContainer;
然后假设您要从SomeType的const方法搜索此集合:
bool SomeType::IsContainered() const
{
return myTypeContainer.find(this) != myTypeContainer.end();
}
这不起作用。 方法中的this
ptr是一个const SomeType *const
,我无法将其放入find
。 问题是find
需要一个const-ref,在这种情况下,这意味着传递的指针被视为const,但不是它指向的东西。
有没有办法顺利解决这个问题(不改变设置的模板类型)?
为了在有序容器中启用“混合”比较,可以使用声明typename key_compare::is_transparent
的key_compare
类型。
set的默认比较functor类是std::less<Key>
。 它不是“透明的”。 但是std::less<void>
是“透明的”并且只要a<b
形成良好,就执行任何参数a
和b
的比较。 因此,您可以定义自己的比较函数类型,或者可以使用std::less<void>
(或等效的std::less<>
):
set<SomeType*,std::less<>> myTypeContainer;
正如你所说,在const成员函数中, this
变成了const SomeType *
(即指向const的指针),它不能被隐式转换为SomeType *
(即指向非const的指针),这是find
的预期参数类型。
您可以使用const_cast
执行显式转换。
bool SomeType::IsContainered() const
{
return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}
如果铸造结果不用于修改,那将是安全的; 而std::set::find
不会这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.