我试图为函数对象编写模板,以充当STL算法函数中的谓词。我仍然很新,我不能正确
这是模板:
#ifndef MEMBERPREDICATE_H
#define MEMBERPREDICATE_H
template <typename Type, typename Class>
class MemberPredicate{
public:
MemberPredicate(Type (Class::*method)(), bool (*operation)(Type,Type), Type data) : method(method), operation(operation), data(data){};
bool operator()(Class * other){ return *(this->operation)(other->*(this->method)(), this->data);}
private:
Type (Class::*method)();
bool (*operation)(Type,Type);
Type data;
};
#endif
构造函数接受指向类的(get)方法的指针,指向作用于该get方法返回的值的比较运算符的指针,以及最终应该用于比较的一些数据
我试图以下列方式使用模板:
bool equal(int a, int b){
return a == b;
}
MemberPredicate<int, IntClass> pred(&IntClass::getInt, &equal, 4)
IntClass * i = new IntClass(5) // stores 5 in IntClass and returns this value when i->getInt() is called
pred(i);
当我不使用函数对象的函数部分时,我可以编译得很好但是当我尝试将它应用于i
时,我得到一个错误:
Must use '.*' or '->*' to call pointer to member function in Member...
bool operator()(Class * other){ return *(this->operation)(other->*(this->method)(), this->data);}
此处标记位于箭头other->
下方
我已经尝试过将箭头指向点并随意移动它们但不能让它工作。
正如我刚才所说的那样,很可能这是一种非常奇怪的事情。如果那是正确方向的情况指针是非常受欢迎的,但我仍然希望掌握这一部分。
最后我有一个额外的问题,我会想让这个部分工作后制作get-method const,但我不确定如何,这里的任何帮助也会很好。
谢谢
答案 0 :(得分:2)
*(this->operation)(other->*(this->method)(), this->data);
^ ^
由于运算符优先级,在取消引用函数指针之前调用调用运算符 ()
。只有在调用调用操作符后才会取消引用。
将其更改为:
(*this->operation)((other->*(this->method))(), this->data);
^ ^
请注意,我还在other->*(this->method)()
周围添加了另一对括号。这是必需的,因为(this->method)()
之前会对other->*
进行评估。
另外,正如@dyp所说,你遗漏了大部分this
限定符,结果如下:
operation((other->*method)(), data);