首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛化共享指针和QSharedPointer::data()与shared_ptr::get()?

泛化共享指针和QSharedPointer::data()与shared_ptr::get()?
EN

Stack Overflow用户
提问于 2012-06-22 12:33:41
回答 1查看 1.2K关注 0票数 1

我制作了建立在QSharedDataPointerQSharedData等长期抽象之上的a Qt library。因此,当我需要一个普通的共享指针时,为了保持一致性,使用QSharedPointer是有意义的。

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

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

代码语言:javascript
复制
#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

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

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

代码语言:javascript
复制
&(*ptr)

如果你正在阅读代码,这可能会有一点减速,有人可能会尝试并优化出这种事情(然后很快就会发现这是行不通的)。但是除了WTF的因素,它似乎是无害的enough...is吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-22 21:38:03

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

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

代码语言:javascript
复制
if( shared_ptr_type ptr = funcReturnsSharedPtr() )
{
    funcAcceptsRawPtr(&*ptr);
}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11150225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档