函数按值返回对象,如果对象不存在,则不返回任何内容

Function returning an object by value or nothing if object doesn't exists

本文关键字:对象 返回 任何内 不存在 函数 如果      更新时间:2023-10-16

如果对象不存在,函数通过值或特殊方式返回类对象的最佳签名是什么?

对于返回多个对象的函数,函数原型是

QList<X> getSomeXOrNothing(); 
  • 如果有对象,它会返回对象列表,如果没有对象,则返回空列表,这完全符合我的需求,并且使用起来很方便

现在,我知道函数只能返回一个对象,或者什么都不返回,什么是最好的签名?返回原始指针是不可取的,因为它有可能导致错误泄漏。

我在争论是返回共享指针还是仍然返回一个只有一个值的列表:

QList<X> getSingleXOrNothing(); 
QSharedPointer<X> getSingleXOrNothing(); 

但我想知道是否有更好的方法可以做到这一点——共享指针增加了不必要的开销,而返回列表是有争议的,因为我知道列表只能包含一个对象。

编辑:所有QList、SharedPointr和QVariant都是可以接受的选项,但我正在为每一个字节都很重要的嵌入式设备开发,并且会有很多对这个函数的调用-所以试图在给定条件下找到最佳容器-它是一个对象或什么都没有。

您可以使用"选项模式"。基本思想是:

template <typename T>
class Optional {
    private:
        bool valueIsPresent;
        T value;
}

然后,从函数中可以返回Optional<YourType>。然后,客户端代码可以在尝试访问和使用某个值之前检查该值是否有效。

我还没有在C++中使用过它,但尝试它可能是一个有趣的想法-为什么不使用延续风格("Church编码"),特别是如果你的编译器支持尾调用优化和C++11(可能没有考虑到它是嵌入式的,但检查它可能很有趣)?

template<typename One, typename Zero, typename X>
X getSomeOrZero (One one, Zero zero) {
    if (logic)
        return one (X ());
    else
        return zero ();
}
void process () {
    auto x = getSome ([] (one) => { handle one }, [] () => { handle zero });
}

关于更保守(正确?)的方法,请参见马里奥的答案。

如果对象不存在,则引发异常。

最简单、最安全的方法。

Plus不需要bool值的额外开销来检查Object是否存在。

Qt本身经常使用isValid()isNull()方法
如果在类中添加一个isValid成员,并在默认构造函数中将该成员初始化为false,那么就有了一个简洁的解决方案。