使用const键类型引用调用std ::指针集的count方法

str*_*ugi 5 c++ stl const

我有一个类似的课程

struct S {

    bool foo(const AType& v) const {
        return values.count(&v); // compile error due to the constness of v
    }

    private:
        std::set<AType*> values;
};
Run Code Online (Sandbox Code Playgroud)

这是一个简化版本.在实际代码中,foo做了一些复杂的事情.代码产生错误

invalid conversion from ‘const AType*’ to ‘std::set<AType*>::key_type {aka AType*}’
Run Code Online (Sandbox Code Playgroud)

我认为FOO应该采取"const的A型和V",因为它不发生变异诉类型成员变量"价值"的不能被标准::设置<常量A型*>由于该结构的召唤非const方法的一些方法"值"中包含的元素.我可以抛弃'v'的常量:

bool foo(const AType& v) const {
    return values.count((AType*) &v);
}
Run Code Online (Sandbox Code Playgroud)

但我认为这可能不是一个好的解决方案.我可以有什么解决方案?

Yak*_*ont 0

template<class T>
struct const_ptr_compare:std::less<T const*> {
  typedef void is_transparent;
};

std::set<AType*, const_ptr_compare<AType>> values;
Run Code Online (Sandbox Code Playgroud)

鲍勃是你叔叔。

我定义了一个比较器,可以透明地处理T const*比较以及T*比较。然后我告诉std::set他它是透明的。

is_transparent技术是对std::set. 您的编译器可能已经支持它。


如果您希望能够传递基类,T则需要做更多的工作。您需要一个函数对象来测试它的两个参数(每个参数都指向 const)以查看哪个是另一个的基类,并使用std::less<base const*>{}(lhs, rhs)该基类。然而,这比我们需要的更进一步。


C++11/03 方法可能涉及制作 的可编辑部分AType mutable,并拥有const AType* set. 如果做不到这一点,aconst_cast<AType*>就是合理的。

请不要使用 C 风格的强制转换:它们几乎从不需要,而且可能会意外地变得太强大。