【问题标题】:Typecast or call functor into a function pointer?类型转换或调用仿函数到函数指针?
【发布时间】:2014-10-01 08:12:05
【问题描述】:

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

错误

错误 C2440: 'type cast' : 无法从 '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

【问题讨论】:

  • 必须有更好的方法来做到这一点... ;)

标签: c++


【解决方案1】:

但我不知道如何让 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;

也就是说,如果您可以调整服务器代码(强制执行“测试”等功能的代码)以期望 std::function&lt;void()&gt; 代替,您将能够将任何东西插入其中(如果您没有在客户端代码中匹配签名,您可以只使用传递给 std::function&lt;void(void)&gt; 的 lambda。

【讨论】:

  • 好吧,我可以将 fn1 和 data 放入 pair* 并将其传递给 adapt 函数,该函数使用参数调用函子,但这是一个额外的函数调用和额外的数据包装。您的代码有点不正确,因为 fn1 是一个局部函数变量,因此无法在该函数内部访问,除非我将它放在一个我不想这样做的全局变量中,因此额外的包装
  • 看看 std::bind 作为替代方案(它创建一个带有绑定参数的函子)。它的问题是你仍然需要用std::function 编写你的服务器接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 2012-06-07
  • 2017-10-06
  • 2022-08-19
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多