将指向成员函数的指针作为void*函数的参数传递

Passing a pointer to a member function as argument for a void* function

本文关键字:函数 void 参数传递 指针 成员      更新时间:2023-10-16

我有以下功能:

void PerformAction(void(*pf_action)());

以及以下类别:

class A
{
public:
    void DoSomething();
}

我希望能够做到这一点:

int main()
{
    A a;
    PerformAction(&(a.DoSomething);
    return 0;
}

我已经看到很多答案说函数签名应该是:

void PerformAction(void(A::*)());

这不是我想要的

我希望能够向它传递任何不接收参数并返回void的函数/方法。不仅仅是A的成员方法,也不仅仅是全局函数。

这在C++中可能吗?

普通函数指针和成员函数指针是不同的。

成员函数采用隐藏的this参数,而普通函数则不采用。要通过指针调用成员函数,需要一个对象来初始化该this参数。

因此,您无法将指向非静态成员函数的指针转换为纯函数指针,并在不传入对象的情况下通过它进行调用。

我希望能够向它传递任何不接收参数并返回void的函数/方法。不仅仅是A的成员方法,也不仅仅是全局函数。

这在C++中可能吗?

是的,这是可能的,但您需要使用更灵活的类型。实现这一点的方法是用不同的类型指定PerformAction函数。您希望使用一个可以用零参数调用并返回voidstd::function<void ()>的类型。例如,将PerformAction函数更改为:void PerformAction(std::function<void ()> fn);。这个版本将允许您接受任何可以用零参数调用并返回void的内容,请参阅下面的代码以获取示例。

示例代码

#include <functional>
#include <iostream>
class Foo
{
public:
    void bar() { std::cout << "Member function: Foo::bar()n"; }
};
void bar()
{
    std::cout << "Free function: bar()n";
}
class Functor
{
public:
    void operator()() { std::cout << "Functor objectn"; }
};
auto lambda = []() { std::cout << "Lambda expressionn"; };
void doSomething(std::function<void ()> fn)
{
    fn();
}
int main()
{
    doSomething(bar);
    doSomething(Functor());
    doSomething(lambda);
    
    Foo foo;
    doSomething(std::bind(&Foo::bar, &foo));
    
    return 0;
}

实际示例

输出示例

Free function: bar()
Functor object
Lambda expression
Member function: Foo::bar()