【问题标题】:Create lambda with different return type?创建具有不同返回类型的 lambda?
【发布时间】:2019-10-29 01:19:59
【问题描述】:

我遇到了这种情况。假设我有一段代码,我想控制它的返回方式:

bool foo() {
  auto doSomething1 = []() {
      return true;
  }
  auto doSomething2 = []() {
      // execute something but not return
  }

  auto finalLambda = condition ? doSomething1 : doSomething2

  if (case1) {
    finalLambda()
  }

  if (case2) {
    finalLambda()
  }
   ... ...

  return true;
}

这是实现此目的的有效(好)方法吗? doSomething1 返回,但 doSomething2 不返回。

【问题讨论】:

  • 从您的示例中不清楚为什么您需要一个 lambda。你不能只执行 if 语句中的所有内容吗?
  • 另外,您使用的至少是 C++17,还是更早的版本?
  • @Chipster 是的,我可以在每个 if 语句中执行。但是在那种情况下,如果有case1,case2...case20,我会复制很多代码。
  • @Chipster 是 c++17
  • 我想要实现这一点,我必须将其模板化,因为我需要在编译期间实现这一点......

标签: c++ templates lambda


【解决方案1】:

我发现您的三元运算符有问题。根据文档:

三元运算符的形式如下:

exp1 ? exp2 : exp3

三元运算符有返回类型。返回类型取决于 exp2,以及根据通常\重载转换规则将 exp3 转换为 exp2。如果它们不可转换,编译器会抛出错误。

是否可以给出该 foo 函数的一些用例?当它被调用时,你期望发生什么?任何可能的情况? 如果所有的 lambda 函数都具有相同的返回类型,您会遇到问题吗?比如可以在第二个函数中添加return false;吗?

【讨论】:

  • 请注意,这是这个问题的关键部分。如果条件为假,我不想返回。我想继续运行,执行doSomething2()直到结束,然后返回。
  • 如果您从 doSomething1 lambda 中取出 c++ return true; 并在 finalLambda() 表达式之后在 case 1 中调用它会怎样? doSomething1() 将始终返回 bool 并且 doSomething2() 不会返回任何内容。或者您是否希望在某个时间点改变这两个?
  • doSomething1() 将始终返回 bool; doSomething2() 不会返回。
  • 您是否期望如果条件为真并且调用了 doSomething1,您的 foo() 函数将在 case1 中终止,而不是通过其余的情况?
猜你喜欢
  • 2019-11-10
  • 2019-04-20
  • 1970-01-01
  • 2023-03-26
  • 2012-08-18
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多