如何声明SWIG接口以同时支持shared_ptr与值类型包装同一类型?
你遇到的问题是因为%shared_ptr(Member)指令的核心作用就是让SWIG把std::shared_ptr<Member>隐式转换为目标语言中的Member对象,这和你希望Member作为值类型的需求冲突。要实现你的目标,只需要调整SWIG接口的写法:
正确的处理步骤
- 移除
%shared_ptr(Member)指令:这个指令会触发智能指针到原始对象的隐式转换,正是你要避免的行为。 - 显式实例化
std::shared_ptr<Member>模板:用%template指令为std::shared_ptr<Member>定义一个独立的目标语言类型,比如MemberPtr,这样SWIG会把智能指针作为单独的类型暴露,而不是自动转成Member。
完整的SWIG接口示例
%module your_module_name // 引入SWIG对std::shared_ptr的支持 %include <std_shared_ptr.i> // 定义Member类,SWIG会默认按值类型处理它 class Member { // 你的Member类成员和方法 }; // 显式实例化std::shared_ptr<Member>为MemberPtr %template(MemberPtr) std::shared_ptr<Member>; class Parent { private: std::shared_ptr<Member> member_; // 如果需要在目标语言中访问这个成员,可改为public或用%extend包装 }; class OtherParent { private: Member member_; };
效果说明
- Member在目标语言中会被当作值类型处理,传递、赋值时按值拷贝(遵循SWIG对普通类的默认绑定规则)。
std::shared_ptr<Member>会被映射为目标语言中的MemberPtr类型,你可以通过这个类型调用智能指针的原生方法(比如reset()、get()等,std_shared_ptr.i已经默认绑定了这些方法)。- Parent类中的
member_(如果暴露)会以MemberPtr类型呈现,不会自动转换为Member对象。
你之前尝试的%shared_ptr(MemberPtr)是多余的,%shared_ptr仅针对原始类类型使用,显式模板实例化已经足够实现你的需求。
内容的提问来源于stack exchange,提问作者Jang Woong Geun
相关产品推荐
相关产品推荐

