doc*_*doc 8 c c++ return return-value
通常你有一个函数,对于给定的参数,它不能生成有效的结果,或者它不能执行某些任务.除了在C/C++世界中不常用的例外之外,基本上有两个学校报告无效结果.
第一种方法将有效返回与不属于函数的codomain的值(通常为-1)混合并指示错误
int foo(int arg) {
if (everything fine)
return some_value;
return -1; //on failure
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是返回函数状态并将结果传递给引用
bool foo(int arg, int & result) {
if (everything fine) {
result = some_value;
return true;
}
return false; //on failure
}
Run Code Online (Sandbox Code Playgroud)
您更喜欢哪种方式?为什么?第二种方法中的附加参数是否会带来显着的性能开销?
Ada*_*ght 15
对于异常和意外错误,请勿忽略异常.
然而,只是回答你的观点,问题最终是主观的.关键问题是考虑让消费者更容易使用什么,同时悄悄地轻推他们以记住检查错误状况.在我看来,这几乎总是"返回一个状态代码,并将值放在一个单独的引用中",但这完全是一个人的个人观点.我这样做的论点......
返回混合错误代码/值模型的参数可能很简单 - 没有额外的变量浮动,一个.但对我来说,危险比有限的收益更糟糕 - 人们很容易忘记检查错误代码.这是例外的一个论点 - 你实际上不能忘记处理它们(如果你不这样做,你的程序就会熄火).
boost optional是一项出色的技术.一个例子将有所帮助.
假设您有一个返回double的函数,并且您希望在无法计算时表示错误.
double divide(double a, double b){
return a / b;
}
Run Code Online (Sandbox Code Playgroud)
在b为0的情况下该怎么做;
boost::optional<double> divide(double a, double b){
if ( b != 0){
return a / b;
}else{
return boost::none;
}
}
Run Code Online (Sandbox Code Playgroud)
像下面一样使用它.
boost::optional<double> v = divide(a, b);
if(v){
// Note the dereference operator
cout << *v << endl;
}else{
cout << "divide by zero" << endl;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
当您开始使用模板时,特殊返回值的想法完全崩溃了.考虑:
template <typename T>
T f( const T & t ) {
if ( SomeFunc( t ) ) {
return t;
}
else { // error path
return ???; // what can we return?
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们无法返回明显的特殊值,因此抛出异常实际上是唯一的方法.返回必须检查的布尔类型并通过引用传递真正有趣的值会导致可怕的编码风格.
| 归档时间: |
|
| 查看次数: |
1014 次 |
| 最近记录: |