#ifndef KPIMPL_H #define KPIMPL_H #include ///////////////////// // KImpl ///////////////////// template < class T, typename Pointer = std::auto_ptr > class KPimpl { public: typedef T Impl; KPimpl() : ptr_(new T) {} T* operator->() { return ptr_.operator->(); } T& operator*() { return ptr_.operator*(); } const T* operator->() const { return ptr_.operator->(); } const T& operator*() const { return ptr_.operator*(); } Pointer& wrapped() { return ptr_; } const Pointer& wrapped() const { return ptr_; } private: KPimpl(const KPimpl&); KPimpl& operator=(const KPimpl&); Pointer ptr_; }; ////////////////////////////////////////// // template for the implementations ////////////////////////////////////////// template struct KImplDef; template class SmartPtr = std::auto_ptr > struct KImpl { typedef KPimpl < KImplDef, SmartPtr< KImplDef > > Ptr; }; #endif