C++ 有没有办法从'std::function'返回到指针?

C++ 有没有办法从'std::function'返回到指针?,c++,function,types,C++,Function,Types,想象一下以下场景: typedef std::function<float(float)> A; typedef float(*B)(float); A foo(); void bar(B b); 显然,这是行不通的。主要是因为A可以包含一个状态,B是一个函数指针。如果我们知道A不包含状态,我们希望以某种方式获取它的“意义”,并将其放入可以传递给AB的东西中,会怎么样 这是不可能的吗?一般来说,std::function可以“装箱”一些(例如,一些的值)。闭包同时包含代码和数据(

想象一下以下场景:

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

A foo();
void bar(B b);
显然,这是行不通的。主要是因为
A
可以包含一个状态,
B
是一个函数指针。如果我们知道
A
不包含状态,我们希望以某种方式获取它的“意义”,并将其放入可以传递给A
B
的东西中,会怎么样


这是不可能的吗?

一般来说,
std::function
可以“装箱”一些(例如,一些的值)。闭包同时包含代码和数据(闭包值)。所以我相信你不能把它转换成裸函数指针。顺便说一句,因为概念上闭包混合了代码和数据语言,而没有提供它们(如C),所以实际上需要(例如,用一些附加数据传递每个函数指针的约定,请查看GTK中的具体示例)


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

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

foo().target<B>();
foo().target();
如果我们知道A不包含一个状态,我们希望以某种方式获取它的“意义”,并将其转化为可以传递给A B的东西,那该怎么办

即使这样也不够
std::function
提供了一个成员函数,如果您知道基础函子的确切类型,就可以将其取回。因此,我们可以这样做,例如:

void print(int i) { std::cout << i; }

std::function<void(int)> f = print;
auto ptr = f.target<void(*)(int)>();  // not null
(*ptr)(42);                           // works
或者它可能是一个lambda,在这种情况下,我们甚至无法命名类型,更不用说将其拉出:

int square(int i) { return i*i; }

f = square;
ptr = f.target<void(*)(int)>(); // nullptr!
f = [](int i){ std::cout << i; }; // same as print, right?
ptr = f.target<void(*)(int)>();   // ... nope :'(

f=[](int i){std::你能知道包含的确切类型吗?一个具有给定签名的std函数可以包含许多无状态类型。如果是,也许。当然不是。不。另外,如果你知道std函数包含什么,为什么不直接传递该类型呢?似乎
std::function::target
可以返回指向该类型的指针,但前提是你知道它包含什么类型是。
foo()
float
,而不是函数指针。
f = [](int i){ std::cout << i; }; // same as print, right?
ptr = f.target<void(*)(int)>();   // ... nope :'(