Zwykle używam boost :: scoped_ptr dla pimpl (na jednego powodu, bo wtedy nie dostanę niespodzianek, jeżeli zapomnę do czynienia z konstruktora kopii)pimpl-idiom w szablonie; który inteligentny wskaźnik?
z szablonami jednak nie można po prostu umieścić w destruktor plik cpp, w którym imp jest w pełni zdefiniowany, aby spełnić wymagania destruktora scoped_ptr. I tak to działa, ale nie jestem pewien, czy można go zagwarantować, czy tylko przypadkiem. Czy istnieje "najlepsza praktyka" lub standard? Czy scoped_ptr jest najlepszym inteligentnym wskaźnikiem dla pimplów w klasach, które nie mogą być kopiowane?
template <class T> class C {
public:
C(){}
~C(){}
private:
boost::scoped_ptr<T> pimpl_;
};
Ten rodzaj implementacji PIMPL nie ma sensu, ponieważ aby utworzyć instancję szablonu C, trzeba wiedzieć o typie T. PIMPL, z drugiej strony, całkowicie ukrywa ekwiwalent T od użytkownika. –
@ VladLazarenko Hmm, myślałem, że boost :: scoped_ptr działa również na wcześniej zadeklarowanych klasach. W tym przypadku zależy to od tego, czy T jest zdefiniowane czy przedszkolne. Instancja tej scoped_ptr byłaby ukryta w implementacji (pimpl_ (nowy T()). –
@DavidFeurle: Niezupełnie, aby ten szablon działał, rozmiar 'T', jak również jego interfejs, musi być odsłonięty, ponieważ "klienci" muszą utworzyć instancję szablonu, na przykład, gdzie nazywacie 'new T()'? Nie można tego ukryć w pliku "cpp", ponieważ musi on być w szablonie, więc to nie jest PIMPL. –