%module smart_pointer_ignore %ignore Derived; %inline %{ class Base { public: void baseMethod() {} }; class Derived : public Base { public: void derivedMethod() {} }; template class Ptr { public: Ptr(T *t) : ptr(t) {} T * operator->() const { return ptr; } private: T *ptr; }; %} %template(DerivedPtr) Ptr; %inline %{ Ptr makeDerived() { return Ptr(new Derived()); } %}