Два года спустя я гораздо лучше понимаю ситуацию, чтобы сохранить актуальность и актуальность ответов о переполнении стека, вот как я отвечу на вопрос сегодня.
Предпосылка моего первоначального вопроса несколько ошибочна.Причиной использования pimpl-idiom является скрытие деталей реализации от компилятора.Это делается путем сохранения реализации через непрозрачный указатель (указатель на объявленный, но не определенный тип данных).Это может значительно уменьшить количество заголовков, необходимых другим модулям компиляции, которые взаимодействуют с классом и, таким образом, ускоряют время компиляции.В случае шаблона в моем вопросе требуется, чтобы тип T был полностью известен в момент создания экземпляра, что на практике требует, чтобы тип impl был полностью определен везде, где используется C<ImplType>
, что явно не является примером pimpl.-idiom в классическом понимании этого термина.
Существуют и другие причины для хранения данных классов с помощью частного указателя, например, это позволяет легко реализовать перемещение и обмен без бросков, а также хорошо, если вашкласс должен выполнять строгую гарантию исключений (см. идиому копирования и обмена Что такое идиома копирования и обмена? ).С другой стороны, он добавляет слой косвенности (часто приводящий к отсутствию кэша) при каждом доступе к impl и распределению / освобождению кучи при создании и уничтожении impl.Это может быть существенное снижение производительности, поэтому это решение не следует считать серебряной пулей.
Если вы можете использовать C ++ 11, тогда вместо boost :: scoped_ptr следует использовать std :: unique_ptr.