如何从单个C ++ return语句返回多个值中的一个?

问题描述 投票:0回答:2
return a or b or c or d;

该语句在C ++中返回truefalse,我知道原因。

但是我需要一种解决方法,以便可以通过该return语句(或类似的东西)返回第一个非零 就像在Python中发生的事情

[我不是在寻找条件语句,因为它看起来不太整洁sometimes

基本上,下面的代码可以通过宏或其他方式缩短吗?

int fun(int a, int b, int c, int d)
{
    return a ? a : b ? b : c ? c : d;
}
c++ algorithm function return boolean-logic
2个回答
2
投票

我会这样写函数:

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是完成此操作的最简单方法。


3
投票

可以通过在return语句中使用必要的功能来完成任务。

© www.soinside.com 2019 - 2024. All rights reserved.