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机真的不清楚。答案的这一部分实际上只是对这个问题的实际答案的额外奖励:PWouldnstd::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;
}