我制作了建立在QSharedDataPointer和QSharedData等长期抽象之上的a Qt library。因此,当我需要一个普通的共享指针时,为了保持一致性,使用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不幸的是,指针类为这些方法选择了不同的名称。值得注意的是,访问包含的指针是由shared_ptr中的.get()和QSharedPointer中的.data()完成的。
我本来打算做一个提取器,某种shared_ptr_type_get<>,但后来注意到可以有效地实现相同的事情(在包含的指针不为null的情况下,我可以通过布尔强制来测试null ):
&(*ptr)如果你正在阅读代码,这可能会有一点减速,有人可能会尝试并优化出这种事情(然后很快就会发现这是行不通的)。但是除了WTF的因素,它似乎是无害的enough...is吗?
发布于 2012-06-22 21:38:03
我在我的一个项目中也使用了这个,除了你已经注意到的可读性之外,使用它没有任何错误。正如Mike Seymour所指出的,您应该始终首先检查ptr不是空指针。
在大多数情况下,我使用以下成语:
if( shared_ptr_type ptr = funcReturnsSharedPtr() )
{
funcAcceptsRawPtr(&*ptr);
}因为任何合理的共享指针类都会重载operator*,所以无论你为shared_ptr_type使用哪种共享指针类型,它都会正确地编译和运行。
https://stackoverflow.com/questions/11150225
复制相似问题