You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何声明SWIG接口以同时支持shared_ptr与值类型包装同一类型?

在SWIG中让Member作为值类型并正确处理std::shared_ptr

你遇到的问题是因为%shared_ptr(Member)指令的核心作用就是让SWIG把std::shared_ptr<Member>隐式转换为目标语言中的Member对象,这和你希望Member作为值类型的需求冲突。要实现你的目标,只需要调整SWIG接口的写法:

正确的处理步骤

  1. 移除%shared_ptr(Member)指令:这个指令会触发智能指针到原始对象的隐式转换,正是你要避免的行为。
  2. 显式实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:17:08