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

时间:2017-04-27 00:25: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
}

使用上面的例子,我相信可变参数模板可以提供帮助。

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);

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

0 个答案:

没有答案