返回 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

本文关键字:CustomClass 情况 失败 抽象 函数 基类 gt air std lt const      更新时间:2023-10-16

我有以下一段代码来搜索类型为 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& ,如果找不到值,则抛出异常。仅当您不太可能搜索地图中不存在的内容时,才使用此选项。