返回 std::p air<const CustomClass &, bool> 用于搜索函数中的失败情况,当 CustomClass 是抽象基类时
Return std::pair<const CustomClass &, bool> for failure case in a search function when CustomClass is an Abstract Base Class
我有以下一段代码来搜索类型为 std::map<int, const CustomClass&>
的地图。如果在地图中找不到该项目,我想返回一个"失败"案例对象。
我在C++中返回"NULL 引用"中的讨论
?使用 std::p air 和 bool 来指示该项是否有效(注意:要求 SomeResource 具有适当的默认构造函数,并且构造成本不高):
std::pair<SomeResource, bool> SomeClass::getSomething(std::string name) {
std::map<std::string, SomeResource>::iterator it = content_.find(name);
if (it != content_.end())
return std::make_pair(*it, true);
return std::make_pair(SomeResource(), false);
}
但是由于我的自定义类是一个抽象基类,我无法实例化它!
有没有更好的方法来规避这一点?我想返回指向类对象的指针可能会允许它是可变的。我想保持返回的对象不可变。
我的代码示例如下所示 -
std::pair<const NpBaseTest::NpBaseTest&, bool> NpTestMgr::find(const UID& p_uid) const
{
auto search = m_pending.find(p_uid);
if(search != m_pending.end())
return std::make_pair(*search, true);
return std::make_pair(NpBaseTest(), false);
}
你应该只做C++17 std::optional
正在做的事情。它不需要任何特殊的编译器支持,因此您可以简单地从任何支持它的库中借用实现。例如,libc++的CLang版本通常很容易阅读。
您很可能不想做的一件事是返回指针。这不是可变性的问题,而是动态内存管理的问题。
有几个选项:
-
您确实可以返回指针。为了确保它是不可变的,只需返回一个
const
指针。 -
您可以创建一个从基类继承的特殊类,该基类除了指示未找到值外什么都不做。例如:
class NpNotFound: NpBaseTest { // implement pure virtual functions with dummy ones };
然后在
NpTestMgr::find()
中做:return std::make_pair(NpNotFound(), false);
-
与其返回
std::pair<SomeClass&, bool>
,不如返回SomeClass&
,如果找不到值,则抛出异常。仅当您不太可能搜索地图中不存在的内容时,才使用此选项。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 函数中堆分配的效果与缺少堆分配的情况
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么这个音频包络不能通过开关的情况?
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 返回 std::p air<const CustomClass &, bool> 用于搜索函数中的失败情况,当 CustomClass 是抽象基类时