我有一个类似的课程
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)
但我认为这可能不是一个好的解决方案.我可以有什么解决方案?
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 风格的强制转换:它们几乎从不需要,而且可能会意外地变得太强大。