gpt4 book ai didi

c++ - 使用 const 键类型引用调用 std::set of pointers 的 count 方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:53 26 4
gpt4 key购买 nike

我有一个类

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;
};

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

invalid conversion from ‘const AType*’ to ‘std::set<AType*>::key_type {aka AType*}’

我认为 foo 应该采用 'const AType& v' 因为它不会改变 v。成员变量“values”的类型不能为 std::set ,因为结构 S 的某些方法调用“values”中包含的元素的非常量方法。我可以摆脱“v”的常量:

bool foo(const AType& v) const {
return values.count((AType*) &v);
}

但我认为总的来说这可能不是一个好的解决方案。我有什么解决方案?

最佳答案

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

std::set<AType*, const_ptr_compare<AType>> values;

鲍勃是你的叔叔。

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

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


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


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

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

关于c++ - 使用 const 键类型引用调用 std::set of pointers 的 count 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26493798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com