作为某个类A
的类成员,我想维护一个存储B
s的std::set
。该集合使用一个自定义比较对象,该对象需要读取非静态类成员,即下面示例代码中的m_t
,以执行其比较。
示例代码:
class B { ... };
class A {
struct Comp {
bool operator()(B b1, B b2) const {
// ... compares b1 and b2, uses m_t
}
};
std::set<B, Comp> m_set;
double m_t;
};
不幸的是,这并没有编译,因为可以理解的是,我们无法访问Comp
中A
的非静态成员。有其他方法可以做到这一点吗?我希望避免将m_t
设置为静态。
(上下文的一些背景:这是为了实现扫描线算法。具体来说,B
实现了一个依赖于m_t
的函数,其中m_t
在0和1之间变化。函数在[0,1]内不相交,因此B
s之间的比较永远不会改变,从而保持std::set
的有效性。对于给定m_t
的sweepline,然后我需要用给定的值查询它周围的集合中的函数。(
编辑:我已经看到了这个问题,现在它被标记为重复到,使用自定义std::set comparator。那里的答案确实解释了如何制作自定义比较器,但与引用另一个类成员无关。
Comp
只是一个C++类,因此您可以根据需要使用任何数据对其进行补充。例如,指向封闭类实例的指针:
struct A {
struct Comp {
A *host;
bool operator()(B b1, B b2) const {
std::cout << host->m_t << std::endl;
// ...m_t is accessible here
}
};
double m_t;
std::set<B, Comp> m_set{ Comp { this } };
};