假设你有一组指针(是的......):
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,但不是它指向的东西。
有没有办法顺利解决这个问题(不改变设置的模板类型)?
答案 0 :(得分:16)
为了启用&#34;混合&#34;在有序容器中进行比较时,您可以使用声明类型名为key_compare
的{{1}}类型。
set的默认比较仿函数类是key_compare::is_transparent
。它不是透明的&#34;。但std::less<Key>
是&#34;透明&#34;只要std::less<void>
格式正确,就可以对任何参数a
和b
进行比较。因此,您可以定义自己的比较函数类型,也可以使用a<b
(或等效std::less<void>
):
std::less<>
答案 1 :(得分:10)
正如你所说,在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
不会这样做。