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

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

我有以下功能:

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

和以下 class:

class A
{
public:
    void DoSomething();
}

我希望能够做到这一点:

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

    return 0;
}

我看到很多回答都说函数签名应该是:

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

这不是我想要的。

我希望能够将任何 function/method 不接收参数且 returns 无效的传递给它。不只是 A 的成员方法或全局函数。

这在 C++ 中可行吗?

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

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

因此,您不能将指向非静态成员函数的指针转换为普通函数指针并在不传递对象的情况下调用它。

I want to able to pass it any function/method that receives no parameters and returns void. Not just member methods of A or just global functions.

Is this possible in C++?

是的,这是可能的,但你需要使用更灵活的类型。实现这一点的方法是用不同的类型指定 PerformAction 函数。您想要使用可以使用零参数和 returns voidstd::function<void ()> 调用的类型。例如,将 PerformAction 函数更改为:void PerformAction(std::function<void ()> fn);。此版本将允许您接受任何可使用零参数和 returns 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 object\n"; }
};

auto lambda = []() { std::cout << "Lambda expression\n"; };

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;
}

Live Example

示例输出

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