在C++中使用模板时返回NULL
Return NULL when using template in C++
如果我有如下接口:
template <typename V, typename K>
V get(K key); // Return the value of the key
"找不到密钥时返回NULL"的规范有意义吗?当除了抛出异常之外没有找到密钥时,是否还有其他方法可以处理这种情况?
抛出异常也是处理不存在密钥的最佳方式吗?
不能假定V
是指针。例如,如果V
是int
,则不能将return
作为nullptr
,因为它不是int
的有效值。如果V
是指针类型,请考虑nullptr
是否是将其插入到映射中的有效值。如果是,调用者如何区分nullptr
(return
表示"未找到")和"实际"nullptr
?
如果您可以return
使用指向映射中项目的指针,而不是副本,请考虑此签名。
template <typename V, typename K>
V * get(K key);
如果不希望调用方修改映射中的对象,请使用const V *
。
或者,您可以使用optional<T>
。您可以在Boost中找到一个实现,以及对标准库的实验扩展。
当然,您也可以将throw
作为一个异常来指示密钥不在您的映射中。然而,只有当您的客户有合理的方式提前知道密钥是否存在时,大多数编码标准才会认为这是一种好的风格。异常应用于表示异常、错误的情况。地图中不存在密钥这一事实不太可能符合这一条件,除非在您的情况下,可以假设密钥集是已知的。
相关文章:
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- fopen 在 gdb 中返回 NULL
- 为什么要从main()返回NULL?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 如何在C++中返回Null作为引用
- 从模板化函数返回Null对象
- GDALOpen 在 GEOTiff 文件上返回 null
- PyThreadState_GET() 从 PyImport_GetModuleDict() 中返回 NULL
- (位图)LoadImage() 返回 NULL,GetLastError() 返回 0
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- 如何为迭代器返回"null"值?
- 具有 4 个指针的节点的递归插入函数返回 null
- winAPI FindResource 仅在 DLL 中返回 NULL
- 使用 dlopen/dlsym 打开C++共享库 - dlsym 返回 NULL
- SetWindowsHookEx 在挂接到其他线程时返回 NULL
- 尚未归shared_ptr所有的实例的 shared_from_this() 总是返回 null?