gpt4 book ai didi

c++ - SWIG 和 C++ 枚举类

转载 作者:行者123 更新时间:2023-12-04 20:26:47 28 4
gpt4 key购买 nike

编辑 : this answer 解决了问题,但最后我提出了一个更模块化的解决方案。看看这个 :)

我从 two 知道discussionsenum class应该选择 enum为了类型安全。出于这个原因,我在我的项目中使用它,但是当用 SWIG 包装它们时,我得到了一些我不太喜欢的东西。

给定简单的枚举

enum class type {
A, B, C, D, E, F, G, H, I
};

.hpp文件,比如说 my_types.hpp ,以及 my_types.i文件:
%module my_types
%{
#include "my_types.hpp"
%}
%include "my_types.hpp"

生成的 python 文件包含 contains
type_A = _my_types.type_A
type_B = _my_types.type_B
type_C = _my_types.type_C
type_D = _my_types.type_D
type_E = _my_types.type_E
type_F = _my_types.type_F
type_G = _my_types.type_G
type_H = _my_types.type_H
type_I = _my_types.type_I

这意味着在 Python 中使用它时,我将不得不这样做
import my_types as mt
mt.type_A

使用它们,这....好吧,在这种情况下还可以,因为 type 这个词不是那么长,但是对于更长的单词,它看起来不太好,而且,对我来说,在每个枚举值的开头都有枚举的名称没有多大意义。

有没有办法重命名它们(也许使用 %rename ),以便使用它们可以像这样简单?
import my_types as mt
mt.A

不知道怎么用 %rename在这种情况下,或者它甚至可以用于此目的。任何帮助,包括关于如何以不同方式做同样事情的想法(可能没有枚举),将不胜感激。谢谢你们。

编辑 :一些评论指出,将枚举的名称放在每个枚举名称的前面确实是有意义的。我想详细说明我为什么说它不(对我)的原因。如果我们考虑一个与枚举相同的模块的情况,那么代码看起来有点多余。由于 types已经是 Python 的模块,更好的例子是颜色:
enum class colours {
Blue, Red
};

并且将按照建议使用包装的代码,如下所示:
import colours
Blue = colours.colours_Blue
Red = colours.colours_Red

在我看来,写作 colours引用 Blue , Red没有必要,因为模块 colours只包含一个“枚举”。换成这个不是更好吗?
import colours
Blue = colours.Blue
Red = colours.Red

一个答案已经解释了如何实现这一点。我会尽快看看。非常感谢!

编辑 : this答案解决了问题。我想对其进行一些更改并提出一个稍微“模块化”的解决方案:
%pythoncode %{
__enum_name = "colours" # your enumeration's name
__enum = __import__(__enum_name) # import module
__scope_name = __enum_name + "_" # scope's name (= "colours_")
__scope_length = len(__scope_name) # length
for name in dir(__enum):
if name.find(__scope_name) == 0:
setattr(__enum, name[__scope_length:], getattr(__enum, name))
delattr(__enum, name) # optional
del name, __enum_name, __enum, __scope_name, __scope_length
%}

我认为这可以让您的项目更容易复制和粘贴,其中您有十分之一的枚举:)。同样,基于 this回答。

最佳答案

其次,我不完全理解您为什么要删除范围(尽管我猜这是因为在 python 中您已经获得了模块范围,而您在 C++ 中没有)。现在,我不认为 %rename可以工作,因为它不是文本转换。但是,我可以想到两种选择,一种在 C++ 中重命名,另一种在 Python 中重命名。
在 C++ 中重命名
更改my_types.hpp到:

enum class type {
A, B, C, D, E, F, G, H, I
};

#ifdef SWIG
constexpr type A = type::A;
constexpr type B = type::B;
constexpr type C = type::C;
constexpr type D = type::D;
constexpr type E = type::E;
constexpr type F = type::F;
constexpr type G = type::G;
constexpr type H = type::H;
constexpr type I = type::I;
#endif
并使用 -DSWIG 编译包装器添加到命令行。
在 Python 中重命名
修改 my_types.i到:
%module my_types
%{
#include "my_types.hpp"
%}
%include "my_types.hpp"

%pythoncode %{
import my_types
for name in dir(my_types):
if name.find('type_') == 0:
setattr(my_types, name[5:], getattr(my_types, name))
delattr(my_types, name) # optional
del name
%}

关于c++ - SWIG 和 C++ 枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58836934/

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