如果对象不存在,函数以值或特殊值返回类对象的最佳签名是什么?
对于返回多个对象的函数,函数原型是
QList<X> getSomeXOrNothing();
现在,我知道函数只返回单个对象或什么都没有,最好的签名是什么?返回原始指针是不可取的,因为它有可能发生错误泄漏。
我正在讨论返回共享指针或仍然返回具有单个值的列表:
QList<X> getSingleXOrNothing();
QSharedPointer<X> getSingleXOrNothing();
但我想知道是否有更好的方法可以做到这一点 - 共享指针增加了不必要的开销,而返回列表是有争议的,因为我知道列表只能包含一个对象。
修改 所有的QList,SharedPointr和QVariant都是可以接受的选项,但我正在为每个字节都很重要的嵌入式设备开发,并且会有很多对这个函数的调用 - 所以试图找到给定条件的最佳容器 - 它是一个对象或者什么都没有。
答案 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
,那么您就有了一个简洁的解决方案。