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

标签 c++ algorithm function return boolean-logic

return a or b or c or d;

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

但是我需要一种变通方法,以便可以像在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/

相关文章:

c++ - 如何让 const char* 函数工作?

r - 如何从函数内打印空行?

c++ - 如何将cstring更改为unicode

c++ - 如何在 C++11 中调度线程?

c++ - 有没有办法使用 std::sort() 并仍然保持基于 1 的索引?

c++ - 对于 C++ 中的静态类(具有私有(private)构造函数),我应该定义一个析构函数吗?

python - 使用 ECC 生成至少为 d 汉明距离的二进制字符串

c - 指数复杂度

algorithm - 具有优先级的方程(表达式)解析器?

c++ - 无法在我的函数中声明结构