1

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

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

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

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

我在返回共享指针或仍然返回具有单个值的列表之间进行辩论:

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

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

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

4

4 回答 4

3

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

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

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

于 2013-08-28T18:04:01.547 回答
1

我没有在 C++ 中使用它,但尝试一下可能是一个有趣的想法 - 为什么不使用延续样式('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 });
}

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

于 2013-08-28T19:13:04.307 回答
0

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

于 2013-08-28T23:06:39.750 回答
0

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

最简单和最安全的方法。

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

于 2013-08-28T18:29:15.133 回答