【问题标题】:Function's returned value type is either an alias ***or*** boolean函数的返回值类型是别名***或***布尔值
【发布时间】:2019-12-26 00:37:20
【问题描述】:

我们如何在调用中获得函数的返回值类型是别名布尔值一次(如果可能的话,预计没有重载)?
让我们实现该功能的说明而已:

struct U {
    int v;
}

int& f( U& u, int t ) {
      if (u.v == t) return u.v ;  // ... 
      else return (bool)0 ;      // ???
}

int main(){
  U u{7};
  int b,c, t=9;

  if (c=f(u, t)) b=c;
}

谢谢

【问题讨论】:

  • 如果你想返回一个字面量值(强制转换为bool实际上是无关紧要的),那么你的函数需要按值返回。另一种方法是返回int *,并返回一个空指针。我想std::variant 也是对您的问题的回答 - 因为不可能有一个返回类型由传递的参数的值确定的函数 - 但您给出的使用示例并不表明这是合适。
  • 我在回答部分 Peter 已经说过很多了:)

标签: c++ function arguments c++17


【解决方案1】:

这就是std::variant 的用途。

在这种情况下,应该是std::variant<int*, bool>

(您不能将引用类型作为变体选项,但指针会适合您。)


但是,您应该确保这确实是您想要的。我知道你的代码只是为了说明,但如果它与你的真实项目有任何相似之处,我不相信返回(bool)0 的可能性(你为什么不写@987654325 @?) 对该功能有意义;也许抛出异常会更清楚,或者“out arguments”,或者std::optional<int*>

当然,如果没有具体的(非虚构的)示例,我只能胡乱猜测您实际上想要做什么。

【讨论】:

  • 不会 std::optional<int*> 模拟明显的行为:if (auto r = get(x)) { **r = 17; }
  • @DietmarKühl 对不起?
  • 您确实提到了optional,但似乎主要建议variant:基于玩具示例,似乎意图是有一些东西表明引用是否已成功设置。可悲的是,无论哪种情况,该方法似乎都需要一个指针:无法保存引用,而且 std::reference_wrapper 似乎不太想转换为非const 引用。
  • 我明白了,你建议optional<int*>。是的,我确实很快提出了这一建议,但我不想在第二次猜测 OP 想要什么的路线上走得太远,因为它真的不清楚 atm。答案的那一部分实际上只是对问题的实际答案的额外奖励:P
【解决方案2】:
struct U {
    int v;
    inline int static  null;

};

int& f( U& u, int t ) {
      if (u.v == t) return u.v ;  // ... 
      return u.null;      // null is zero, hence (false)
}

int main(){
  U u{7};
  int b,c, t=9;

  if (c=f(u, t)) b=c;
}

【讨论】:

  • @nonock 他们创建了一个int,具有static 存储持续时间(因此您的程序中只有一个,并且它被初始化为零),称为null(名字的选择真的很糟糕;它已经误导了你!称之为zero 或其他东西),你可以将你的引用绑定到。你可以稍后再做&theResultOfF == &U::null 看看你是否退回了那个东西。这是我自己(或多或少)多次使用的模式....但是从您的问题中很难知道这是否实现了您想要实现的目标。
  • @nonock 这不是nullptr。您可以将其视为此类的空值。 @Lightness Races BY-SA 3.0 的评论给出了inline static int 的解释
  • 签入main 不太正确,除非u.v 永远不能为零。使用这种方法,您需要检查 identity(即比较地址,而不是值)。
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2019-03-05
  • 2021-10-29
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
相关资源
最近更新 更多