C++ 功能';s返回值类型为别名***或***布尔值

C++ 功能';s返回值类型为别名***或***布尔值,c++,function,arguments,c++17,C++,Function,Arguments,C++17,我们如何在一次调用中获得一个函数的返回值类型是别名或布尔值(如果可能的话,不需要重载)? 让我们认识到该函数仅用于说明: 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=

我们如何在一次调用中获得一个函数的返回值类型是别名或布尔值(如果可能的话,不需要重载)?
让我们认识到该函数仅用于说明:

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;
}
谢谢

这就是为什么

在本例中,这将是一个
std::variant

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


然而,你应该确保这是你真正想要的。我意识到你的代码只是为了说明,但如果它与你的真实项目有任何相似之处,我不相信返回
(bool)0
(你为什么不写
false
?)的可能性对该函数有意义;可能抛出异常会更清楚,或者“输出参数”,或者
std::optional

当然,如果没有一个具体的(非虚构的)例子,我只能疯狂地猜测你到底在做什么。

这就是为什么

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;
}
在本例中,这将是一个
std::variant

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


然而,你应该确保这是你真正想要的。我意识到你的代码只是为了说明,但如果它与你的真实项目有任何相似之处,我不相信返回
(bool)0
(你为什么不写
false
?)的可能性对该函数有意义;可能抛出异常会更清楚,或者“输出参数”,或者
std::optional



当然,如果没有一个具体的(非虚构的)示例,我只能疯狂地推测您实际要做的是什么。

如果您想要返回一个文本值(强制转换到
bool
实际上是不相关的),那么您的函数需要按值返回。另一种方法是返回一个
int*
,然后返回一个空指针。我想,
std::variant
也是你所问问题的答案——因为不可能有一个返回类型由传递参数的值决定的函数——但是你给出的用法示例并不表明这是合适的。我在答案部分已经说过,如果你想返回文字值(强制转换为
bool
实际上是不相关的),那么您的函数需要按值返回。另一种方法是返回一个
int*
,然后返回一个空指针。我想,
std::variant
也是你所问问题的答案——因为不可能有一个返回类型由传递参数的值决定的函数——但你给出的用法示例并不表明这是合适的。我在回答部分已经说了彼得:)不会
std::optional
对明显的行为进行建模:
if(auto r=get(x)){**r=17;}
@DietmarKühl对不起?您确实提到了
optional
,但似乎主要是建议
variant
:基于玩具示例,其目的似乎是要有一些东西来指示引用是否成功设置。不幸的是,这种方法似乎在两种情况下都需要一个指针:引用无法保持,而且它似乎不太想转换为非
const
引用。是的,我很快就提出了这个建议,但我不想在事后猜测OP想要tbh什么的过程中走得太远,因为atm机真的不清楚。答案的这一部分实际上只是对这个问题的实际答案的额外奖励:PWouldn
std::optional
对明显的行为建模:
if(auto r=get(x)){**r=17;}
@DietmarKühl我很抱歉?您确实提到了
可选
,但似乎主要是建议
变体
:根据玩具示例,其目的似乎是有一些东西指示参考是否成功设置。不幸的是,这种方法似乎在两种情况下都需要一个指针:引用无法保持,而且它似乎不太想转换为非
const
引用。是的,我很快就提出了这个建议,但我不想在事后猜测OP想要tbh什么的过程中走得太远,因为atm机真的不清楚。答案的这一部分实际上只是对问题实际答案的额外奖励:P@nonock他们创建了一个名为
null的
int
,具有
static
存储持续时间(因此您的程序中只有一个,并且初始化为零)(名称上的选择真的很糟糕;它已经误导了你!称它为
zero
或其他东西),你可以将引用绑定到它。你可以稍后执行
&结果==&U::null
,看看你是否返回了那个东西。这是我使用过的模式(或多或少)我自己不止一次……但是从你的问题中很难知道这是否完成了你想要完成的。@nonock它不是
nullptr
。你可以把它看作这个类的null。而
inline static int
的解释是由@Lightness Races by-SA 3.0签入
main
不是很正确,除非
u.v
永远不能为零。使用这种方法,您需要检查标识(即比较地址,而不是值)。@nonock他们创建了一个
int
,具有
静态
存储持续时间(因此您的程序中只有一个,并且初始化为零),称为
null
(名称上的选择真的很糟糕;它已经误导了你!称它为
zero
或其他东西),你可以将你的引用绑定到它。你可以稍后执行
&theResultOfF==&U::null
来查看你是否返回了那个东西。它是
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;
}