如何将函数指针传递给成员函数c++?

Posted

技术标签:

【中文标题】如何将函数指针传递给成员函数c++?【英文标题】:How to pass function pointer to member function c++? 【发布时间】:2017-10-29 13:31:01 【问题描述】:

所以这就像我关于该主题的第二个问题,但这次我想知道如果我传递一个 int 类型的函数会怎样。就像这里我想将 fun1 的输出存储在主函数中的变量“int my”中.我应该如何为此编写包装函数?

#include<iostream>
using namespace std;

class student

public:
    int fun1(int m) 
     
        return 2*m;
    

    int wrapper(int (student::*fun)(int k))
    
        (this->*fun)(int k)
    
;

int main()
   
    student s;
    int l=5;
    int my=s.wrapper(&student::fun1(l));
    cout << m << endl;
    return 0;

【问题讨论】:

你想用这个包装函数实现什么是有问题的。 完全错误。 (this-&gt;*fun)(int k) 不是有效的 C++,@user0042。 @user0042 出现错误 :( @codie 考虑阅读错误信息。它通常会告诉您出了什么问题。 (this-&gt;*fun)(int k) 不是有效的 C++。这是一个函数调用,与任何其他函数调用没有什么不同,只是该函数是通过方法指针调用的。函数调用有值作为参数。例如,要将值 2 传递给采用 int 参数的函数,您只需指定值 2。而不是 int 2 【参考方案1】:

包装器调用者需要两个参数: 一个用于调用的函数,一个用于 调用它的参数

int wrapper(int (student::*fun)(int), int k)

    return (this->*fun)(k);

这样称呼:

int my = s.wrapper(&student::fun1, 1);
cout << my << endl;

看这里http://coliru.stacked-crooked.com/a/cd93094c38bfa591

【讨论】:

【参考方案2】:

当标准库中提供了mem_fn() 时,为什么还要创建自己的包装器:

int my = mem_fn(&student::fun1)(&s,l);
cout<<my<<endl;

Online demo

【讨论】:

以上是关于如何将函数指针传递给成员函数c++?的主要内容,如果未能解决你的问题,请参考以下文章

将 C++ 成员函数指针传递给 STL 算法

C++成员函数指针指向全局函数指针

在 C++ 中将指向基类的指针传递给派生类的成员函数

如何将成员函数指针传递给模板函数中的重载方法?

在 gcc 上将成员函数指针传递给模板成员函数时出现问题

如何使用 C++ lambda 将成员函数指针转换为普通函数指针以用作回调