return a or b or c or d;
该语句返回C++中的
true
或false
,我知道原因。但是我需要一种变通方法,以便可以像在Python中那样通过该return语句(或类似的东西)返回第一个非零值。
我不是在寻找条件语句,因为它看起来很乱sometimes。
基本上,以下代码是否可以通过宏或其他方式缩短?
int fun(int a, int b, int c, int d)
{
return a ? a : b ? b : c ? c : d;
}
最佳答案
我会这样写函数:
int fun(int a, int b, int c, int d) {
if (a) return a;
else if (b) return b;
else if (c) return c;
return d;
}
它很干净而且很短。我可以在这里停下来,但让我们探索可以做什么...
有一种算法已经可以满足您的要求。对this answer中的解决方案进行了少许修改:
#include <algorithm>
#include <initializer_list>
template <typename T>
T first_non_zero_or_zero(const std::initializer_list<T>& args)
{
auto it = std::find_if_not(args.begin(),args.end(),[](auto v){ return v==0;});
return (it != args.end()) ? *it : 0;
}
对 bool(boolean) 表达式使用函数的缺点是不会使人烦恼。如果通过以下方式调用该函数:
auto x = first_non_zero_or_zero( { foo(), expensive_function() });
然后,无论返回什么
expensive_function
,都必须调用foo
。恢复短路能力的方法是传递可调用对象,这将是template <typename F>
auto first_non_zero_or_zero(F f){ return f();}
template <typename First,typename...F>
auto first_non_zero_or_zero(First f,F... others){
if (auto temp = f()) return temp;
return first_non_zero_or_zero(others...);
}
int foo(){ return 0;}
int expensive_function(){ return 42;}
int main()
{
std::cout << first_non_zero_or_zero(foo,expensive_function);
return 0;
}
但是,当使用简单的
int
进行调用时,这会使调用不必要地变得冗长,因为您需要将它们包装在可调用中:int fun(int a,int b,int c) {
first_non_zero( [](){ return a;},
[](){ return b;},
[](){ return c;})
}
结论:不要使事情变得不必要的复杂。函数应该做一件事。
fun
要做的一件事是返回4个整数的第一个非零值,而if-else
是完成此操作的最简单方法。
关于c++ - 如何从单个C++ return语句返回多个值中的一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61609680/