带有成员函数指针的模板

时间:2014-04-02 19:24:24

标签: c++ templates pointers

我试图为函数对象编写模板,以充当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,但我不确定如何,这里的任何帮助也会很好。

谢谢

1 个答案:

答案 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);