函数按值返回对象,如果对象不存在,则不返回任何内容
Function returning an object by value or nothing if object doesn't exists
如果对象不存在,函数通过值或特殊方式返回类对象的最佳签名是什么?
对于返回多个对象的函数,函数原型是
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
,那么就有了一个简洁的解决方案。
相关文章:
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用