gpt4 book ai didi

c++ - 指向成员函数的指针解析

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:41 26 4
gpt4 key购买 nike

这是一个用于过滤对象列表的仿函数。它必须用指向对象类的成员函数的指针实例化,作为访问不同元素的一种方式。

class Filter_Compare : public Filter {
std::string (File::*fun)();
public:
Filter_Compare(const char *name, const char *desc, std::string (File::*f)())
: Filter(name, desc), fun(f)
{}
~Filter_Compare() {};

int operator () (File* f1, File* f2) { return this->eval(*f1, *f2); }
int eval(File* f1, File* f2) const { return this->eval(*f1,*f2); }

int eval(File& f1, File& f2) const {
return f1.*(this->fun()).compare(f2.*(this->fun()));
}
};
//an instanciation example :
Filter_Compare fname("Name", "Compare by name", File::getPath);

然后 g++ 返回这些错误:

Filter.h: In member function ‘int Filter_Compare::eval(File&, File&) const’: Filter.h:48:27: error: must use ‘.’ or ‘->’ to call pointer-to-member function in ‘((const Filter_Compare*)this)->Filter_Compare::fun (...)’, e.g. ‘(... ->* ((const Filter_Compare*)this)->Filter_Compare::fun) (...)’ Filter.h:48:53: error: must use ‘.’ or ‘->’ to call pointer-to-member function in ‘((const Filter_Compare*)this)->Filter_Compare::fun (...)’, e.g. ‘(... ->* ((const Filter_Compare*)this)->Filter_Compare::fun) (...)’

我在这里没有看到问题,因为我已经在另一个类上使用过它而没有任何错误(好吧,至少它编译了,我现在无法运行它),代码是:

lit_type eval(File& f) const { return f.*(this->fun()) - thValue; }

这里究竟出了什么问题?我不知道如何以另一种方式引用指针。谢谢!

最佳答案

要通过指向成员函数的指针进行调用,您可以使用 .*->*。要在 File& f1 上调用 fun,调用是 (f1.*fun)()。所以:(f1.*fun)().compare((f2.*fun)())。如果您想使用不需要的显式 this-> 使表达式复杂化,您必须格外小心:(f1.*(this->fun))()。比较((f2.*(this->fun))()).

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

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