Если сведения о том, как вы реализуете PIMPL, можно использовать повторно, вам не следует расстраиваться из-за их обнародования. Главное - поддерживать интерфейс в чистоте.
Иногда вы хотите поделиться помощниками, которые действительно не должны использоваться извне. В этот момент , четко документирующее , что вещи не должны использоваться повторно, является реальной проблемой, которую вы пытаетесь решить . Мне нравится использовать для этого подробные / приватные заголовки.
// Implementation details, not for reuse
namespace some_public_ns {
namespace detail {
// .. shared code
}}
Обычно вы помещаете этот подробный код в собственный заголовок. Организации обычно выбирают соглашение об именовании, чтобы избежать путаницы.
thingajig.h
thingajig_priv.h
thingajig_detail.h
Это не удержит людей с дробовиками в вашей гостиной. Я бы сказал, что вы не должны пытаться. Тем не менее, действительно трудно случайно вставить этот общий код.
Затем в ваших файлах cpp, которые повторно используют код, вы можете просто включить подробное пространство имен в пространство имен anon.
namespace some_public_ns {
namespace {
using namespace detail;
}}
Это позволяет избежать беспорядка в ваших пространствах имен, но при этом не требуется указывать ::detail
при реализации.