将依赖于对象的比较器作为模板参数传递,
Posted
技术标签:
【中文标题】将依赖于对象的比较器作为模板参数传递,【英文标题】:passing object dependent comparator as template argument, 【发布时间】:2013-08-07 08:46:02 【问题描述】:我有一个类似于以下的课程。我正在使用需要比较器作为模板参数的 boost 库的配对堆。我的比较器应该访问 A 类的数据和成员以进行比较。最初,我将 'my_compare' 声明为结构并重载 () 运算符。但是除非将指向 A 类的指针('this')传递给它,否则该结构无法访问 A 类的数据。但这意味着 my_compare 不再是编译时常量,并且会产生错误:“this”不能出现在常量表达式中。
作为第二次尝试,我将 my_compare 声明为成员函数(以便它可以访问成员和数据)。我现在收到以下错误:
error: type/value mismatch at argument 1 in template parameter list for
‘template<class T> struct boost::heap::compare’
我怀疑有两种可能的解释:“my_compare”不是(函数)对象,也不是二进制函数,因为“this”是隐式传递的。我该如何解决这个问题。
class A
public:
//some data(properties)
struct c
//some data
;
double method1(int variable);
double method2(const struct c&);
bool my_compare(struct c& c, struct c& d)
//accesses member methods and data
typedef boost::heap::pairing_heap<struct c, boost::heap::compare<my_compare> > myheap;
【问题讨论】:
将my_compare
设为static
成员。
不能那样做。它必须访问非静态成员和函数
比较器函数应该只比较参数并在它们是否“相等”时返回一个布尔值,它不需要使用其他任何东西。如果是这样,那么您必须使您比较的结构的那些成员(即在c
中创建一个成员,如A* a;
)。
呃,别以为你能做到。有没有机会将A
的this
粘贴到A* my_owner
内的c
中?
@JoachimPileborg:同样的想法,嗯?
【参考方案1】:
您需要在c
中存储一个A*
。可能是这样的:
class A
public:
//some data(properties)
struct c
//some data
A* owner_A;
c(A* a) : owner_A(a)
;
double method1(int variable);
double method2(const struct c&);
static bool my_compare(struct c& c, struct c& d)
//accesses member methods and data
c->owner_A->method1(42);
d->owner_A->method2(d);
typedef boost::heap::pairing_heap<struct c, boost::heap::compare<my_compare> > myheap;
【讨论】:
像魅力一样工作。我没有让它静态。非常感谢。【参考方案2】:首先要做的事情:my_compare
函数要么必须是一个独立的函数,或者是 static
。在你的情况下真的没有办法解决。
但是,如果您确实需要访问A
类中的成员,那么您可以将c
结构中的指针指向A
实例:
struct c
A* a;
// Other members
;
然后,当您创建c
对象时,您将a
指针设置为this
。
【讨论】:
【参考方案3】:你应该使用仿函数。
class A
struct my_compare;
friend struct my_compare;
struct my_compare
A &self;
A(A &self) : self(self)
bool operator()(struct c& c, struct c& d)
// access member data and methods on self
;
当然你必须告诉它使用哪个A
实例,所以你必须在构造堆时像my_compare(*this)
一样构造它。
注意,你必须让内部类成为朋友,这不是自动的。您可以声明它,使其成为朋友并定义它,或者您可以定义它,使其成为朋友,但您必须将运算符主体放在类之外。
【讨论】:
以上是关于将依赖于对象的比较器作为模板参数传递,的主要内容,如果未能解决你的问题,请参考以下文章