Swig 类型映射内部构造函数到受保护

Posted

技术标签:

【中文标题】Swig 类型映射内部构造函数到受保护【英文标题】:Swig typemap internal constructor to protected 【发布时间】:2016-07-06 21:57:02 【问题描述】:

我的 C# 代码使用第三方库,用 C++ 编写并使用 Swig 将其包装在 C# 中(这里有三个项目,MyCodeCS、ThirdCpp 和 ThirdCs

因此,如果我在 cpp 中有带有公共构造函数 Acpp()Acpp(int) 的 Acpp 类,我最终会使用带有类 Acs、正确定义的构造函数 Acs()Acs(int) 的包装 C# 版本(到目前为止,一切都很好),它们都使用内部的 swig 生成的构造函数:Acs(IntPtr cPtr,bool)

(当然 cpp 和 cs 类都被命名为 A,但为了清楚起见,我会用 cpp 和 cs 后缀命名它们)

现在,我正在集成一个新的 cpp 模块 (MyCodeCpp),其中包含一个继承自 Acpp 的类 Bcpp。到目前为止,一切都很好:Bcpp 继承自 Acpp,我可以毫无问题地从我的 C# 代码中调用它,使用它的IntPtr

我的问题是,为了让我的 Bcs 对象被识别为 Acs,我需要定义这样的 Bcs 类。这是一个相当愚蠢的,因为我已经得到了 cptr:

public class Bcs : Acs

    public Bcs(IntPtr cptr): base(cptr,true)

问题是...Acs(IntPtr,bool) 是内部的,这意味着如果我想这样做,我需要:

将 Bcs 添加到thirdCS 项目中并重建thirdCS,这就是我现在所做的并且工作正常但让我的首席架构师不满意,因为现在我们有一个应该属于MyCodeCS 的类,因为它是MyCodeCpp 类的包装器,其实属于thirdCs 以某种方式修改 swig 行为,以便 Acs(IntPtr,bool) 受到内部保护而不是内部保护,因此它可以由基于 MyCodeCS 的 Bcs 类调用

问题是:我不知道该怎么做,或者即使有可能?

非常感谢

【问题讨论】:

你能显示示例 .i 文件吗? 虽然我很确定您的问题有一个简单的解决方案,但仅通过文字很难理解潜在的问题。你能展示一个minimal 完整的例子,我需要在我的开发环境中试用它吗?我什至无法说服自己,您目前实际上正在尝试解决正确的问题。 【参考方案1】:

解决了。 只需要放

SWIG_CSBODY_PROXY(public, public, SWIGTYPE)
SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE)

在我的 .i 文件中

【讨论】:

以上是关于Swig 类型映射内部构造函数到受保护的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swig 修改类构造函数以保持对构造函数参数之一的引用?

为啥受保护的构造函数会在此代码中引发错误?

SWIG——在扩展内使用类型映射

内部接口 *比内部受保护的构造函数更不可访问?

如何在 swig & python 中为没有默认构造函数的 std::pair<> 创建接口?

Swig:如何将 c++ 字符串 const & 类型映射到 python 字符串?