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

时间:2013-08-28 18:00:59

标签: c++ qt containers

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

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

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

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

我正在讨论返回共享指针或仍然返回具有单个值的列表:

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

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

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

4 个答案:

答案 0 :(得分:3)

您可以使用“选项模式”。基本思路是:

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

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

答案 1 :(得分:1)

我没有在C ++中使用它,但尝试这可能是一个有趣的想法 - 为什么不使用continuation样式('Church encoding'),特别是如果你的编译器支持尾调用优化和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 });
}

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

答案 2 :(得分:0)

如果对象不存在则抛出异常。

最简单,最安全的方法。

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

答案 3 :(得分:0)

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