Я создал библиотеку Qt, построенную на устаревших абстракциях, таких как QSharedDataPointer
и QSharedData
. Поэтому, когда мне понадобился обычный общий указатель, имело смысл использовать QSharedPointer
для согласованности.
Сейчас я использую это в проекте С++ 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, это кажется достаточно безобидным... не так ли?
&*ptr
дает неопределенное поведение, если указатель имеет значение null. - person Mike Seymour   schedule 22.06.2012static_cast<bool>
и QSharedPointer, и shared_ptr проверить на нуль, если вам нужно; у них есть одинаковая поддержка для этого. - person HostileFork says dont trust SE   schedule 23.06.2012