下面是一个代码:
#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::bind
和boost::bind
,但他们返回功能对象,不是指针,正如我所看到的,不能被“铸造”纯功能性的指针。 虽然函数签名( SetupIterateCabinet
)正好需要一个纯FUNC指针。
我需要一个告知如何解决这个问题。 谢谢。
你已经大大简单化了您的实际问题,把你的问题为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);
}
你不能转换std::function
的函数指针(你可以做相反的事情)。 您应该使用函数指针,或std::function
秒。 如果你能使用std::function
,而不是指针,那么你应该。
这使你的代码的工作:
typedef function<void(void)> fp;