c++ - 如何从 std::function 中提取和执行目标

标签 c++ c++11 lambda std-function

我有类似的东西:

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/

相关文章:

c++ - C++11 是否允许 vector<const T>?

c++ - 如何使用 TBB 多线程 "tail call"递归

c# - Linq 如何在所有值都等于 null 或 0 时获取平均值? MVC

c++ - 如何将 lambda 作为成员函数的函数指针参数传递?

c++ - 如何在c/c++中复制结构?

c++ - 无法链接共享对象

iphone - 我可以将 CAArchive 类添加到我的 iPhone 项目以序列化数据吗?如果是这样,如何?

c++ - 为什么 std::memcpy (作为类型双关的替代方法)不会导致未定义的行为?

c++ - 模拟一堆卡片的最佳容器

python - 应用和 Lambda 函数 - ValueError : The truth value of a Series is ambiguous. 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()