返回值为const引用时如何返回“not found”

时间:2011-10-21 09:16:07

标签: c++ reference

我有一个问题,当我使用这样的东西时:

const MyList& my_list = getListForThisRegion(/*region ID, ...*/);

我不知道在找不到任何值时要返回什么。

我的问题是我希望有一种方法可以向调用者发出信号(当从getListForThisRegion返回值时)“未找到值”。如果我返回一个指针,我可以返回nullptr,但我不知道如何使用引用。我能想到的只是拥有not_found类型的静态成员MyList,并返回对它的引用,但它看起来很难看。

是的,我无法返回值,因为列表“很胖”并经常使用。

编辑:很多很好的答案,但例外不是一个可接受的解决方案,因为它会被提高的次数很高(nbNotFound/nbCalls百分比很高)。
EDIT2:关于boost :: optional - 掌握它有多复杂?我的意思是它需要一些非显而易见的知识(非显而易见=不仅仅是知道语法的东西)吗?

5 个答案:

答案 0 :(得分:7)

有两种惯用方法可以解决这个问题:

  • 更改您的界面以返回能够引用任何内容的类型(例如,可以为null的指针,end的迭代器)。

  • 如果找不到该项,则抛出异常。

返回一个虚拟对象有点hacky,并且你没有获得任何东西而不返回一个指针,因为你仍然必须根据特殊值(null或虚拟对象)检查结果。

答案 1 :(得分:3)

如何重写函数以引用返回列表的“returnValue”?然后该函数可以返回表示找到/未找到的布尔值。

bool getListForThisRegion(/*region ID, ...*/, MyList& ret_list);

答案 2 :(得分:1)

我会编写异常类(层次结构,如果需要)并为这种情况抛出异常。

答案 3 :(得分:1)

我只看到两种可能性:要么在MyList类中有一个特殊成员,声明实例是“null”(未设置),要么你可以抛出异常。

答案 4 :(得分:1)

您可以按照std::map的引导,将默认构造列表插入容器,并返回对该引用的引用。显然,这取决于默认列表和根本不存在的列表之间没有语义差异。

您还可以添加搜索特定区域的查询功能,如果有列表则返回true,否则返回false。然后,您可以在访问者安全中抛出异常,因为它知道它不常见。