【问题标题】:Can't pass 'const pointer const' to const ref无法将“const 指针 const”传递给 const ref
【发布时间】:2018-08-09 07:47:09
【问题描述】:

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

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,而不是它指向的东西。

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

【问题讨论】:

标签: c++ templates pointers constants pass-by-const-reference


【解决方案1】:

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

set 的默认比较函子类是std::less&lt;Key&gt;。它不是“透明的”。但是std::less&lt;void&gt; 是“透明的”,只要a&lt;b 格式正确,它就会比较ab 的任何参数。所以你可以定义你自己的比较函子类型,或者你可以使用std::less&lt;void&gt;(或等效的std::less&lt;&gt;):

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

【讨论】:

  • 两种解决方案各有优缺点。我接受了上面的答案,因为它解决了我特定情况下的问题。感谢您提供替代方案!
【解决方案2】:

如你所说,在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 不会那样做。

【讨论】:

  • @songyanyao 我认为没有必要使用const_cast,我在回答中描述了一个更平滑的替代方案。
  • 吹毛求疵:this 的类型是 const SomeType*(不是 const 指针)。
猜你喜欢
  • 2020-04-13
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多