的std ::功能 - >函数指针(std::function -> function poi

2019-06-24 09:09发布

下面是一个代码:

#include <functional>
using namespace std::tr1;

typedef void(*fp)(void);

void foo(void)
{

}

void f(fp)
{

}

int main()
{
  function<void(void)> fun = foo;
  f(fun); // error
  f(foo); // ok
}

本来我需要从非静态类方法的函数指针,因为我需要保存功能的召唤之间的数据。 我试过std::tr1::bindboost::bind ,但他们返回功能对象,不是指针,正如我所看到的,不能被“铸造”纯功能性的指针。 虽然函数签名( SetupIterateCabinet )正好需要一个纯FUNC指针。

我需要一个告知如何解决这个问题。 谢谢。

Answer 1:

你已经大大简单化了您的实际问题,把你的问题为XY问题 。 让我们回到你的真正的问题:如何调用SetupIterateCabinet与非静态成员函数作为回调。

鉴于一些类:

class MyClass
{
public:
    UINT MyCallback(UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
    {
        /* impl */
    }
};

为了使用MyClass::MyCallback的第三个参数SetupIterateCabinet ,你需要传递一个MyClass*Context参数,使用普通的垫片功能采取这种Context参数并做正确的事吧:

UINT MyClassCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
{
    return static_cast<MyClass*>(Context)->MyCallback(Notification, Param1, Param2);
}

int main()
{
    MyClass mc;
    SetupIterateCabinet(_T("some path"), 0, MyClassCallback, &mc);
}


Answer 2:

你不能转换std::function的函数指针(你可以做相反的事情)。 您应该使用函数指针,或std::function秒。 如果你能使用std::function ,而不是指针,那么你应该。

这使你的代码的工作:

typedef function<void(void)> fp;


文章来源: std::function -> function pointer
标签: c++ bind functor