如果发生错误,则返回错误值,否则,继续执行函数
Return error value if an error occurs, otherwise, continue with function
有没有更好的(更具可读性和/或更少的重复代码(方法来用C++编写它?
int func()
{
int error = foo(); // can return true/false
if (error != 0) // if an error is returned from foo(), pass it up to the caller of func()
return error;
// otherwise, proceed
error = bar(); // can return true/false
if (error != 0)
return error;
return error; // all calls succeeded, return 0.
}
如果您只想返回 true(非零(或 false(零(的指示,而不是您调用的函数返回的实际值
int func()
{
return foo() || bar();
}
如果foo()
或bar()
返回非零,这将返回1
,并发生短路,因此如果foo()
返回非零,则不会调用bar()
。 在这种情况下,请考虑返回bool
而不是int
。
如果foo()
或bar()
可以返回一系列非零值(例如,指示不同的错误条件(,并且您需要保留这些值
int func()
{
int error = foo();
if (!error) error = bar();
return error;
}
你的版本看起来不错。我唯一要避免的是重用相同的变量,而是为每个错误使用一个单独的变量并严格限定其范围:
int func()
{
if (int const error = foo())
return error;
if (int const error = bar())
return error;
return 0;
}
是:
void func()
{
foo();
bar();
}
如果发生意外情况,任一函数都会向调用方引发异常。
错误代码是 C 主义。
如果你倾向于经常使用这种结构,我建议你定义一个monad来隐藏重复行为。一个简单的实现将是这样的。
实现
template<typename Return, Return True>
class Monad
{
Return _result;
public:
Monad() : _result(True) {}
public:
template<typename Function, typename... Args>
Monad&
call(Function f, Args ...args)
{
if (_result == True) {
_result = f(args...);
}
return *this;
}
Return result() { return _result; }
};
用法
bool f() { std::cout << __PRETTY_FUNCTION__ << "n"; return true; }
bool g(int n) { std::cout << __PRETTY_FUNCTION__ << "n"; return n == 42; }
bool h() { std::cout << __PRETTY_FUNCTION__ << "n"; return true; }
int main()
{
Monad<bool, true> m;
const bool result = m.call(f)
.call(g, 56)
.call(h)
.result();
std::cout << std::boolalpha << result << "n";
}
在这种情况下,仅调用f()
和g(56)
(h()
不调用(;result()
返回false
.
演示
你想要outcome<T>
.
https://ned14.github.io/outcome/
但是为了节省一些击键,您将引入更大的编译时间。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 否则在新程序中没有以前的 if 错误
- 如果发生错误,则返回错误值,否则,继续执行函数
- 不允许调用 gil 要求函数,否则 gil 编译错误与 C++
- 如果否则错误:如何使其打印任何数字
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- 错误:"否则"之前应为非限定 ID
- C++否则表达式错误
- 如果,否则产生错误 C2181:非法否则没有 if
- 海湾合作委员会执行官如果和否则也是..这是一个错误