如何从单个C++return语句中返回多个值中的一个
How to return one out of multiple values from a single C++ return statement?
return a or b or c or d;
该语句在C++中返回true
或false
,我知道其原因。
但我需要一个变通方法,这样我就可以像在Python中一样,通过返回语句(或类似的语句(返回第一个非零值。
我不是在寻找条件语句,因为它有时看起来不整洁。
基本上,以下代码可以通过宏或其他方式缩短吗?
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;
}
它又干净又短。我可以到此为止,但让我们探索一下可以做些什么。。。
有一种算法已经几乎达到了你想要的效果。对这个答案中的解决方案进行了轻微修改:
#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() });
那么无论foo
返回什么,都必须调用expensive_function
。恢复短路能力的方法是传递可调用文件,这将是
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语句中使用必要的函数来完成。
例如,我使用了一个模板函数来代替宏,该函数接受std::initializer_list
中的参数:
template <typename T>
T OR(const std::initializer_list<T>& args)
{
for (const T& arg : args)
if (arg)
return arg;
return T{};
}
对于给定的问题,它可以如下使用:
return OR({a, b, c, d});
该环节的问题也可以通过这种方式解决:
return OR({(m + s - 1) % n, n});
注意,它取决于给定类型T
的隐式布尔转换。因此,例如,空的std::string
不是false
。此外,用户定义的类型应该具有operator bool() const
,以便符合此解决方法。
p。S.当我试图在问题中询问我在可变模板解决方案中的错误时,我自己发现了这个解决方案:P
注意:
查看此答案,了解在处理更复杂的设计时这种方式的局限性。
相关文章:
- C++,class,一个返回对象的函数
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 两个相同的重载运算符[]一个返回引用
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 为什么要定义一个返回结构的 lambda 函数,而不是直接定义结构
- 有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
- 提升:创建一个返回变体的函数
- C++重载运算符两次,一个返回非常量引用,另一个返回常量引用,首选项是什么
- 我是否应该将最后一个“返回”语句封装为“else { return .. }',如果它在逻辑上是可选的
- 野牛解析器:创建一个返回令牌的函数
- 为什么 C++ 数组的大小不能有一个返回常量的函数调用
- 如何创建一个返回传递的参数名称的函数
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 将返回的指针分配给另一个返回的指针
- 如何声明一个返回类型是推导出来的函数
- Constexpr语言 - 为什么只是一个返回语句
- 如何创建一个返回护士函数的函数
- 如何用C包装一个返回智能指针的C++函数
- 如何使用两个函数,一个返回迭代器,另一个返回const_iterator