1

我制作了一个基于长期抽象的 Qt 库QSharedDataPointer,例如和QSharedData. 因此,当我需要一个普通的共享指针时,QSharedPointer为了保持一致性,使用它是有意义的。

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

库本身中的 C++11 依赖项不一定是可取的,因此感觉您应该能够选择要使用的共享指针类型。作为向前迈进的第一步,我尝试了 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<>但后来注意到一个可以有效地实现同样的事情(在包含的指针不为空的情况下,我可以通过布尔强制测试空):

&(*ptr)

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

4

1 回答 1

3

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

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

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

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

于 2012-06-22T13:38:03.403 回答