gpt4 book ai didi

c++ - 带有指向成员函数指针的模板

转载 作者:行者123 更新时间:2023-11-30 04:06:40 27 4
gpt4 key购买 nike

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

谢谢

最佳答案

*(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);

关于c++ - 带有指向成员函数指针的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821094/

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