我想写一个类似于下面的程序:
cv::Point keyPoint
keyPoint = outputOfFunction(); // Return value is not set to anything if no valid results.
if( //keyPoint was set by the function above... ){
// Do something with this value
else{
// Do nothing
}
但是cv :: Point没有类似于empty()的成员函数。
实施上述目标的最佳方法是什么?
如果没有有效的结果,我真的不希望outputOfFunction()返回一个点......这样做似乎有些笨拙。
答案 0 :(得分:3)
可能的选项摘要:
1)通过引用传递并在值有效时返回bool
bool f(cv::Point &p);
2)在失败时返回一些固定值,如cv :: Point(-1,1)
3)返回boost :: optional:
boost::optional<cv::Point> f();
auto might_be_point = f();
if (might_be_point.is_initalized())
cv::Point point = might_be_point.get();
4)在失败时抛出异常:
class my_logic_exception: public std::exception { }
cv::Point f() {
if (sth_goes_wrong)
throw my_logic_exception;
// ...
}
一般情况下我会建议3)或4)。
答案 1 :(得分:1)
有几种选择。正如Rollen D'Souza在评论中建议的那样,一个选项是返回bool
并通过引用传递cv::Point
。
在某些情况下,某些返回值在特定域中无效。例如,假设您的cv::Point
必须是图像中的有效坐标,即坐标必须为正(并且小于宽度/高度)。在这些情况下,您可以返回这样的无效值以指示失败,例如cv::Point(-1,-1)
。