return a or b or c or d;
该语句在C ++中返回true
或false
,我知道原因。
但是我需要一种解决方法,以便可以通过该return语句(或类似的东西)返回第一个非零值 就像在Python中发生的事情。
[我不是在寻找条件语句,因为它看起来不太整洁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;
}
将函数用于布尔表达式的缺点是不会使人心烦。如果您通过以下方式调用该函数:
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
是完成此操作的最简单方法。
可以通过在return语句中使用必要的功能来完成任务。