想象一下以下场景:
typedef std::function<float(float)> A;
typedef float(*B)(float);
A foo();
void bar(B b);
您希望按照以下方式执行以下操作:
bar(foo());
显然这不起作用。主要是因为A
可以包含状态,B
是函数指针。如果我们知道A
不包含某个州并且我们希望以某种方式将其视为“意义”并将其置于可以为B
传递的内容中,该怎么办?
这不可能吗?
答案 0 :(得分:4)
如果可以确保存储在A中的可调用对象是函数指针或带有空捕获列表的lambda,则可以通过这种方式简单地获取函数指针:
foo().target<B>();
答案 1 :(得分:2)
一般来说,std::function
可以&#34;框&#34;一些closure(例如某些lambda function的值)。并且闭包包含两个代码和数据(闭合值)。所以我相信你不能移植将它转换为裸函数指针。顺便说一下,因为概念上的闭包是混合代码和不提供它们的数据语言(如C)实际上需要callbacks(即通过一些额外的数据传递每个函数指针的约定,请查看GTK的具体示例)。
某些特定于实现的技巧可能会在堆栈上生成trampoline函数(例如,可能使用asmjit动态生成一些包含指针到闭包的机器代码,等等)。但这不是可移植的和系统特定的(特别是因为堆栈需要可执行)