11

这是一个代码:

#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::bindand boost::bind,但它们返回的是函数对象,而不是指针,正如我所见,它不能“强制转换”为纯函数指针。而函数签名 ( SetupIterateCabinet) 恰好需要一个纯 func 指针。

我需要一个建议如何解决这个问题。谢谢你。

4

2 回答 2

8

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

这使您的代码工作:

typedef function<void(void)> fp;
于 2012-05-11T16:51:14.330 回答
7

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

给定一些课程:

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

为了MyClass::MyCallback用作 的第三个参数SetupIterateCabinet,您需要为参数传递 aMyClass*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);
}
于 2012-05-11T17:01:39.017 回答