有没有什么方法可以从“std::function”返回到指针
Is there any way to go back from `std::function` to a pointer?
想象一下以下场景:
typedef std::function<float(float)> A;
typedef float(*B)(float);
A foo();
void bar(B b);
你希望做一些类似于的事情
bar(foo());
显然,这是行不通的。主要是因为A
可以包含一个状态,而B
是一个函数指针。如果我们知道A
不包含状态,并且我们希望以某种方式获得它的"意义",并将其放入可以传递给B
的东西中,该怎么办?
这不可能吗?
如果您可以确保存储在A中的可调用对象是一个函数指针或一个具有空捕获列表的lambda,那么您可以通过以下方式简单地获取函数指针:
foo().target<B>();
通常,std::function
可以"装箱"一些闭包(例如,某个lambda函数的值)。闭包包含代码和数据(闭合值)。因此,我认为您不能可移植地将其转换为裸函数指针。顺便说一句,因为概念上的闭包混合了代码和不提供它们的数据语言(如C)实际上需要回调(即传递带有一些额外数据的每个函数指针的约定,请参阅GTK中的具体示例)。
一些特定于实现的技巧可能会在堆栈上生成蹦床函数(例如,可能使用asmjit动态生成一些包含指向闭包的指针的机器代码等)。但这不是可移植的,也不是特定于系统的(特别是因为堆栈需要可执行)
如果我们知道A不包含一个状态,并且我们希望以某种方式将其"意义"转化为可以传递给B的东西,会怎么样?
即使这样也不够。std::function
提供了一个target()
成员函数,如果您知道底层函子的确切类型,就可以取回它。所以我们可以做,例如:
void print(int i) { std::cout << i; }
std::function<void(int)> f = print;
auto ptr = f.target<void(*)(int)>(); // not null
(*ptr)(42); // works
然而,即使我们的函子f
不包含state,也不意味着它的底层类型正是void(*)(int)
。它可能是一个完全不同的函数指针,在这种情况下,我们将无法将其拉出:
int square(int i) { return i*i; }
f = square;
ptr = f.target<void(*)(int)>(); // nullptr!
或者它可能是lambda,在这种情况下,我们甚至无法命名类型,更不用说提取它了:
f = [](int i){ std::cout << i; }; // same as print, right?
ptr = f.target<void(*)(int)>(); // ... nope :'(
基本上,类型擦除实际上是类型擦除。如果您需要原始的底层类型,这很可能表明设计不好。
- 如何检查 log2 'inbuilt c++ function'是否返回 '-inf'?
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 如何返回用参数包定义的成员函数的std::function对象
- std::function<std::optional<T>()> 如何与返回 T 的 lambda 兼容?
- 如何让"factory function"返回不可复制的对象?
- void *function() 是指向函数的指针还是返回 void* 的函数?
- std::function 中不允许引用返回类型吗?
- 无法将 std::绑定返回值分配给 std::function
- 如何根据"function like"参数推导函数模板的返回类型?
- 从作为模板函数参数传递的 std::function 推导返回和参数类型
- 编译错误:返回引用时"no matching function for call to" static_cast
- 使用 std::function 时选择自动返回类型而不是构造函数的调用运算符
- 如何从std :: function推断返回值类型
- MsiViewFetch "SELECT * FROM `Property`"成功,但返回"Incorrect function." C++
- 有没有办法获取"current function"的返回类型
- C++函数,它接受成员函数并向其返回静态 lambda/std::function
- 确定"generic function"的返回类型
- 检查返回的 std::function 是否在 C++11 中"valid"
- 有没有什么方法可以从“std::function”返回到指针
- 使用std::function返回函数