当返回值为常量引用时如何返回"not found"
How to return "not found" when return value is const reference
我有一个问题,当我使用这样的东西:
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。然后,您可以在访问器安全中抛出异常,因为知道这不会经常发生。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 方法错误"not all control paths return a value"和方法不返回值
- C++初学者:为什么我的编译器根据我的循环返回"name not found"?
- 在数组中查找元素,如果找到则返回Find,否则返回not Find
- 我的代码应该接受一个数字,并返回字母等级或"Grade is not valid"但 else 语句不起作用
- dlopen(RTLD_NOLOAD) 在 dlclose() 仍然返回 not null
- 在 Qt 中选择查询返回"value: not positioned on a valid record"
- 为什么此代码只能识别文本文件中的第一行?输入任何大于 1 的数字都会返回"Atomic Number Not Found"
- 位NOT运算符返回意外的负值
- 当返回值为常量引用时如何返回"not found"
- SQLite INSERT 命令返回错误"column number is not unique"
- 返回"does not name type"的模板化类
- 错误:"dependent name is not a type" 。当在类中使用 typedef 类型作为返回值时,带有模板
- 为什么ITypeInfo::Invoke返回0x80020003 (Member not found.) ?
- 枚举类型的函数返回错误"was not declared in this scope"
- 为什么bool和not bool在这种情况下都返回true