将函子类型转换或调用到函数指针中

Typecast or call functor into a function pointer?

本文关键字:函数 指针 调用 类型转换      更新时间:2023-10-16

我有一些代码需要test这样的函数。第三方希望它像test2一样。使用下面的代码,我可以将函数test分配给fn1fn3rdParty,但我不知道如何使fn1fn3rdParty 一起工作

错误

错误C2440:"类型强制转换":无法从"std::function"转换为"void*(__cdecl*)(void*)"

代码

class Data {};
void*test(Data*data) { return 0; }
void*test2(void*data) { return 0; }
function<void*(Data*)> fn1 = test;
void*(*fn3rdParty)(void*) = test2;
fn3rdParty = (void*(*)(void*))test;
fn3rdParty = (void*(*)(void*))fn1;//error

但我不知道如何让fn1与fn3rdParty 一起工作

试试这个:

// this is outside your code's scope, as a
// local function (eventually placed in a namespace)
void adapt_fn1(void* data) { return fn1( reinterpret_cast<Data*>(data); }
// client code:
fn3rdParty = adapt_fn1;

也就是说,如果您可以调整服务器代码(强制使用"test"等函数的代码)以期望std::function<void()>,那么您将能够将任何东西插入其中(如果您在客户端代码中没有匹配的签名,则可以使用传递到std::function<void(void)>中的lambda)。