这是一个代码:
#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::bind和boost::bind,但他们返回功能对象,不是指针,正如我所看到的,不能被"铸造"纯功能性的指针.虽然函数signature(SetupIterateCabinet)需要一个纯粹的func指针.
我需要建议如何解决问题.谢谢.
您无法将a转换std::function为函数指针(您可以执行相反的操作).您应该使用函数指针或std::functions.如果你可以使用std::function而不是指针,那么你应该.
这使您的代码工作:
typedef function<void(void)> fp;
Run Code Online (Sandbox Code Playgroud)
您已经大大简化了您的实际问题,并将您的问题转化为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)
| 归档时间: |
|
| 查看次数: |
14612 次 |
| 最近记录: |