gpt4 book ai didi

c++ - 泛化共享指针和 QSharedPointer::data() vs shared_ptr::get()?

转载 作者:行者123 更新时间:2023-11-30 03:01:21 25 4
gpt4 key购买 nike

我做了 a Qt library它建立在像 QSharedDataPointer 这样的长期抽象之上和 QSharedData .所以当我需要一个普通的共享指针时,使用 QSharedPointer 是有意义的。为了一致性。

我现在在 C++11 项目中使用它。为了使代码更标准,我切换到 shared_ptr用于其所有本地子系统。

库本身内的 C++11 依赖项不一定是理想的,因此感觉您应该能够选择要使用的共享指针类型。作为继续前进的第一步,我尝试了 Flexibility of template alias in C++0x 中建议的这种方法。 (无可否认,C++11 依赖本身,但我可以在非 C++11 构建中通过编译器标志使用预处理器)

#if THINKERQT_USE_STD_SHARED_PTR

#include <memory>
template<class T>
using shared_ptr_type = std::shared_ptr<T>;

#else

#include <QSharedPointer>
template<class T>
using shared_ptr_type = QSharedPtr<T>;

#endif

不幸的是,指针类为方法选择了不同的名称。值得注意的是,访问包含的指针是由 .get() 完成的。在 shared_ptr 和 .data()在 QSharedPointer 中。

我打算做一个提取器,某种 shared_ptr_type_get<>但随后注意到可以通过以下方式有效地实现相同的事情(在包含的指针不为空的情况下,我可以通过 bool 强制测试是否为空):

&(*ptr)

如果您正在阅读代码,这会有点减速,有人可能会尝试优化这种东西(然后很快发现这是行不通的)。但除了 WTF 因素之外,它似乎是无害的……是吗?

最佳答案

我也在我的一个项目中使用它,除了您已经注意到的可读性之外,使用它没有任何问题。正如 Mike Seymour 指出的那样,您应该始终首先检查 ptr 是否不是空指针。

我在大多数情况下使用以下成语:

if( shared_ptr_type ptr = funcReturnsSharedPtr() )
{
funcAcceptsRawPtr(&*ptr);
}

无论您为 shared_ptr_type 使用哪种共享指针类型,都可以保证它会正确编译和运行,因为任何合理的共享指针类都会重载 operator* .

关于c++ - 泛化共享指针和 QSharedPointer::data() vs shared_ptr::get()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11150225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com