完美地转发lambda并将其作为函数对象存储在C++;14/17

完美地转发lambda并将其作为函数对象存储在C++;14/17,lambda,c++14,Lambda,C++14,我们如何完美地转发lambda并将其存储到具有固定签名的给定函数对象?lambda实际上是由用户定义的,可以返回整数,也可以不返回任何参数。如果给定的lambda没有返回值,包装器应该返回一个默认值(比如-1),或者只返回lambda中的任何值 std::function<int()> func; auto L1 = [](char joe) { return 1; } auto L2 = [](char joe, float num) { // no return }

我们如何完美地转发lambda并将其存储到具有固定签名的给定函数对象?lambda实际上是由用户定义的,可以返回整数,也可以不返回任何参数。如果给定的lambda没有返回值,包装器应该返回一个默认值(比如-1),或者只返回lambda中的任何值

std::function<int()> func;

auto L1 = [](char joe) {
  return 1;
}

auto L2 = [](char joe, float num) {
  // no return
}

我不知道实施这样的事情是否可行。任何帮助都将不胜感激。

lambda是否需要使用不同的参数值多次调用?是的……这就是我不知道的原因。我不明白您的代码片段中缺少了什么功能。。。是否希望将
L1
复制/移动到结果函数对象中,而不是仅通过引用捕获?是否需要使用不同的参数值多次调用lambda?是的…这让我无法理解您的代码段中缺少了哪些功能。。。是否希望将
L1
复制/移动到结果函数对象中,而不是仅通过引用捕获?
template <
  typename C, typename... T, typename R = std::result_of_t<C(T...)>,
  std::enable_if_t<std::is_same_v<void, R> *= nullptr >
>
auto make_function(C&& c, T&&... args) {
  return [&]() { c(args...); return -1; }
}

template <
  typename C, typename... T, typename R = std::result_of_t<C(T...)>,
  std::enable_if_t<std::is_same_v<int, R> *= nullptr >
>
auto make_function(C&& c, T&&... args) {
  return [&]() { return c(args...); }
}
func = make_function(L1, 'a');
func = make_function(L2, 'b', 1.2f);