我有类似的东西:
auto dummy(std::function<int(int)> ifunc) {
auto vals = std::vector<int>(1000000);
for(auto& v: vals) {
v = ifunc(v);
}
}
假设 std::function
没有绑定(bind)到有状态的 lambda(虽然它可能绑定(bind)到没有状态的 lambda),提取底层函数指针和执行的正确方法是什么它而不是 std::function
?
这是我的尝试,但无论我是否取消引用目标,它都会崩溃。
auto dummy(std::function<int(int)> ifunc) {
auto vals = std::vector<int>(1000000);
auto&& target = *ifunc.target<int(int)>();
for(auto& v: vals) {
v = target(v);
}
}
最佳答案
std::function
的原因exists 是提供具有特定签名的函数的抽象。 std::function
中的实际 函数(或函数对象)对象不必具有 std::function
的签名对象提供。例如,您的 function<int(int)>
对象可以包含一个指向函数的指针,该函数接受 double
并返回 char
; std::function
里面的代码对象负责转换。
target
模板成员函数返回指向目标对象的指针仅当目标对象具有由target
的模板参数指定的确切类型 .因此,例如,如果目标对象采用 double
并返回 char
, 呼唤 ifunc.target<char(double)>
会给你一个指向那个函数的指针。使用任何其他参数类型调用它都会返回一个空指针。
在此处显示的代码中,调用是 ifunc.target<int(int)>()
,这将返回一个空指针,除非目标对象的确切类型是“采用int
并返回int
的函数”。
如果您要使用此模板成员函数,您必须在对返回值执行任何其他操作之前检查空指针。
关于c++ - 如何从 std::function 中提取和执行目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46038293/