std :: function - >函数指针

fog*_*bit 11 c++ bind functor

这是一个代码:

#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
}
Run Code Online (Sandbox Code Playgroud)

最初我需要从非静态类方法创建一个函数指针,因为我需要在函数调用之间保存数据.我试过std::tr1::bindboost::bind,但他们返回功能对象,不是指针,正如我所看到的,不能被"铸造"纯功能性的指针.虽然函数signature(SetupIterateCabinet)需要一个纯粹的func指针.

我需要建议如何解决问题.谢谢.

mfo*_*ini 8

您无法将a转换std::function为函数指针(您可以执行相反的操作).您应该使用函数指针或std::functions.如果你可以使用std::function而不是指针,那么你应该.

这使您的代码工作:

typedef function<void(void)> fp;
Run Code Online (Sandbox Code Playgroud)

  • 您如何建议他更改`SetupIterateCabinet`(一个C API)来获取C++对象? (4认同)

ild*_*arn 7

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

鉴于某些课程:

class MyClass
{
public:
    UINT MyCallback(UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
    {
        /* impl */
    }
};
Run Code Online (Sandbox Code Playgroud)

为了使用MyClass::MyCallback第三个参数SetupIterateCabinet,你需要MyClass*Context参数传递一个并使用普通的shim函数来获取该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);
}
Run Code Online (Sandbox Code Playgroud)