%module cpp11_shared_ptr_template_upcast %{ #include #include %} %include %include %{ class Base { public: Base() : value(0) {} Base(int v) : value(v) {} virtual ~Base() {} virtual int GetResult() = 0; int value; }; class Derived : public Base { public: Derived() : Base() {} Derived(int v) : Base(v) {} virtual ~Derived() {} int GetResult() { return value*2; } }; template class Printable : virtual public T { public: Printable(int param) : T(param) {} ~Printable() {} std::string GetFormatted() { return std::string("The formatted result is: ").append(std::to_string(this->GetResult())); } }; std::shared_ptr > MakePrintableDerived(int param) { return std::make_shared >(param); } %} %shared_ptr(Base); %shared_ptr(Derived); %shared_ptr(Printable) class Base { public: Base(); Base(int v); virtual ~Base(); virtual int GetResult() = 0; int value; }; class Derived : public Base { public: Derived(); Derived(int v); virtual ~Derived(); int GetResult(); }; /* Virtual inheritance is contrived for this case, but exposes whether SWIGSmartPtrUpcast generated a correctly typed shared pointer of the upcasted class type - if the pointer type is incorrect, this will result in a segmentation fault (on Windows, this could manifest as undefined behavior) when trying to access members inherited from T through a shared_ptr >. */ template class Printable : virtual public T { public: Printable(int param); ~Printable(); std::string GetFormatted(); }; std::shared_ptr > MakePrintableDerived(int param); %template(PrintableDerived) Printable;