gpt4 book ai didi

python - 打破 SWIG Python 接口(interface)——容器创建命名空间冲突

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:24 24 4
gpt4 key购买 nike

我们的代码库目前支持单个 SWIG 接口(interface)文件(用于 Python),该文件多年来已经增长到包括大约 300 个 C++ 类(技术接口(interface)),所有这些类都继承自一个基类,并且所有这些都存在于一个单一的全局命名空间。这使我们能够使用最少的 SWIG 代码在 SWIG 类表示的 C++ 类之间实现动态转换,同时通过将 C++ 继承结构保留在 SWIG 之外来进行简化。

只要我们在单个模块中编译我们的 SWIG 接口(interface),这种机制就可以很好地工作——但是随着 SWIG 接口(interface)文件的增长,它变得难以管理,并且编译/链接时间也增加了。为了解决这个问题,我根据派生类的名称将接口(interface)文件分成单独的模块——一个模块用于以“A”到“G”开头的类名,一个用于以“H”到“N”开头的名称,等等., 产生四个派生类模块和一个基类模块。按照此处概述的方法,我能够编译和链接这些模块,并展示动态转换的预期行为:( http://www.swig.org/Doc3.0/SWIGDocumentation.html#Modules_nn1 )

但是,当容器发挥作用时,将单个模块分成四个部分(五部分算上基类)会导致命名空间出现问题。考虑以下函数,来 self 的 v-to-z 接口(interface)文件中的一个类:

void RemoveIsolated(const std::vector<global::IFoo*> spRemoveIsolated) {

它采用存在于全局命名空间中的派生类之一的 vector 。当我只有一个模块但现在 IFoo 类存在于 a-to-g 模块中时,这毫无问题地工作——因此,如果我将某些内容转换为 IFoo*,它就是 a-to-g.IFoo*。但是,该函数需要一个 global::IFoo*。

这似乎是 SWIG 模板机制可以解决的情况。我见过人们通过在某一时刻(可能在基类的接口(interface)文件中??)声明取得成功的讨论

%template(FooVector) std::vector<global::Foo*>;

还有一点(可能在派生类的接口(interface)文件中??):

%template () std::vector<global::Foo*>;

但是我尝试实现它并没有成功。讨论有些模棱两可,可能是我做错了什么。任何人都可以提供澄清,最好是举个例子吗?

最佳答案

您似乎缺少的信息是 %import 指令,它让模块与类型的定义协作,而不重复它们并且仍然以单个包装类型结束。文档建议将其用于 reduce module size even .

可能您需要做的就是让您的 v-to-z 模块 %import 和 a-to-g 模块让这个为您工作。 (就我个人而言,我会尝试按功能而不是按字母顺序来划分它们,所以它们之间的依赖关系不会成为问题)

关于python - 打破 SWIG Python 接口(interface)——容器创建命名空间冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51948983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com