我有一个问题,当我使用这样的东西时:
const MyList& my_list = getListForThisRegion(/*region ID, ...*/);
我不知道在找不到任何值时要返回什么。
我的问题是我希望有一种方法可以向调用者发出信号(当从getListForThisRegion
返回值时)“未找到值”。如果我返回一个指针,我可以返回nullptr
,但我不知道如何使用引用。我能想到的只是拥有not_found
类型的静态成员MyList
,并返回对它的引用,但它看起来很难看。
是的,我无法返回值,因为列表“很胖”并经常使用。
编辑:很多很好的答案,但例外不是一个可接受的解决方案,因为它会被提高的次数很高(nbNotFound/nbCalls
百分比很高)。答案 0 :(得分:7)
有两种惯用方法可以解决这个问题:
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。然后,您可以在访问者安全中抛出异常,因为它知道它不常见。