假设您有一组指针(是的.):
std::set<SomeType*> myTypeContainer;然后假设您想从SomeType的const方法中搜索这个集合:
bool SomeType::IsContainered() const
{
return myTypeContainer.find(this) != myTypeContainer.end();
}这不管用。方法中的this ptr是一个const SomeType *const,我不能将它放入find中。问题是find接受一个const,在本例中这意味着传递的指针被视为const,而不是它所指向的东西。
是否有一种方法可以顺利地解决这个问题(而不改变设置的模板类型)?
发布于 2018-03-01 09:23:57
如前所述,在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则不会这样做。
发布于 2018-03-01 10:32:07
为了在有序容器中启用“混合”比较,可以使用声明typename key_compare::is_transparent的key_compare类型。
集合的默认比较函式类是std::less<Key>。它不是“透明的”。但std::less<void>是“透明的”,只要a和b格式良好,就可以对任何参数进行比较。因此,您可以定义自己的比较函子类型,也可以使用std::less<void> (或等效的std::less<>):
set<SomeType*,std::less<>> myTypeContainer;https://stackoverflow.com/questions/49046357
复制相似问题