当返回值为常量引用时如何返回"not found"

How to return "not found" when return value is const reference

本文关键字:返回 not found 何返回 返回值 常量 引用      更新时间:2023-10-16

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

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

我不知道当没有找到值时该返回什么。

我的问题是,我想有一种方式来信号(当从getListForThisRegion返回值)"未找到值"通知调用者。如果我要返回一个指针,我可以返回nullptr,但我不知道如何使用引用。我所能想到的是有一些MyList类型的静态成员not_found,并返回对它的引用,但它看起来很丑。

是的,我不能返回值,因为列表是"脂肪"和经常使用。

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

有两种惯用的方法来处理这个问题:

  • 修改你的接口,让它返回一个不引用任何东西的类型(比如一个可以为null的指针,一个指向end的迭代器)。

  • 如果没有找到,则抛出异常。

返回一个虚拟对象有点笨拙,并且您不会从返回指针中获得任何东西,因为您仍然需要根据特殊值(null或虚拟对象)检查结果。

如何重写函数以引用"returnValue",你把列表返回?然后函数可以返回布尔值,指示找到/未找到。

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

对于这种情况,我会编写一个异常类(层次结构,如果需要的话)并抛出一个异常。

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

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

您还可以添加一个查询函数,用于搜索特定区域,如果有列表则返回true,否则返回false。然后,您可以在访问器安全中抛出异常,因为知道这不会经常发生。