12

假设你有一组指针(是的......):

std::set<SomeType*> myTypeContainer;

然后假设你想从 SomeType 的 const 方法中搜索这个集合:

bool SomeType::IsContainered() const
{
    return myTypeContainer.find(this) != myTypeContainer.end();
}

这行不通。方法中的thisptr 是 a const SomeType *const,我不能放入find. 问题是find需要一个 const-ref,在这种情况下,这意味着传递的指针被视为 const,而不是它指向的东西。

有没有办法顺利解决这个问题(不改变设置的模板类型)?

4

2 回答 2

16

为了在有序容器中启用“混合”比较,您可以使用key_compare声明 typename 的类型key_compare::is_transparent

set 的默认比较函子类是std::less<Key>. 它不是“透明的”。Butstd::less<void>是“透明的”,只要格式正确,就可以比较a任何b参数a<b。因此,您可以定义自己的比较函子类型,也可以使用std::less<void>(或等效地std::less<>):

set<SomeType*,std::less<>> myTypeContainer;

于 2018-03-01T10:32:07.400 回答
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不会那样做。

于 2018-03-01T09:23:57.830 回答