#ifndef PIMPL_IMPL_HPP_ #define PIMPL_IMPL_HPP_ #include <utility> template<typename T> pimpl<T>::pimpl () : m_ {new T {}} {} template<typename T> template<typename ...Args> pimpl<T>::pimpl (Args&& ...args) : m_ {new T {std::forward<Args> (args)...} } {} template<typename T> pimpl<T>::~pimpl () {} template<typename T> T * pimpl<T>::operator -> () {return m_.get ();} template<typename T> T const * pimpl<T>::operator -> () const {return m_.get ();} template<typename T> T& pimpl<T>::operator * () {return *m_.get ();} template<typename T> T const& pimpl<T>::operator * () const {return *m_.get ();} #endif