有没有办法从`std :: function`返回到指针?

时间:2015-11-23 05:48:31

标签: c++ function types

想象一下以下场景:

typedef std::function<float(float)> A;
typedef float(*B)(float);

A foo();
void bar(B b);

您希望按照以下方式执行以下操作:

bar(foo());

显然这不起作用。主要是因为A可以包含状态,B是函数指针。如果我们知道A不包含某个州并且我们希望以某种方式将其视为“意义”并将其置于可以为B传递的内容中,该怎么办?

这不可能吗?

2 个答案:

答案 0 :(得分:4)

如果可以确保存储在A中的可调用对象是函数指针或带有空捕获列表的lambda,则可以通过这种方式简单地获取函数指针:

foo().target<B>();

答案 1 :(得分:2)

一般来说,std::function可以&#34;框&#34;一些closure(例如某些lambda function的值)。并且闭包包含两个代码和数据(闭合值)。所以我相信你不能移植将它转换为裸函数指针。顺便说一下,因为概念上的闭包是混合代码和不提供它们的数据语言(如C)实际上需要callbacks(即通过一些额外的数据传递每个函数指针的约定,请查看GTK的具体示例)。

某些特定于实现的技巧可能会在堆栈上生成trampoline函数(例如,可能使用asmjit动态生成一些包含指针到闭包的机器代码,等等)。但这不是可移植的和系统特定的(特别是因为堆栈需要可执行)