编辑:这个答案解决了问题,但最后我提出了一个更加模块化的解决方案。一探究竟 :)
我从两次 讨论中知道,为了类型安全,enum class
应该选择哪个。enum
出于这个原因,我在我的项目中使用它,但是当用 SWIG 包装它们时,我得到了一些我不太喜欢的东西。
给出简单的枚举
enum class type {
A, B, C, D, E, F, G, H, I
};
Run Code Online (Sandbox Code Playgroud)
在一个.hpp
文件中,比如说my_types.hpp
,并且该my_types.i
文件:
%module my_types
%{
#include "my_types.hpp"
%}
%include "my_types.hpp"
Run Code Online (Sandbox Code Playgroud)
生成的python文件包含包含
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
Run Code Online (Sandbox Code Playgroud)
这意味着当在Python中使用它时我必须这样做
import my_types as mt
mt.type_A …
Run Code Online (Sandbox Code Playgroud) 像我这样的类似问题已经在这个社区中讨论过(有几个帖子,比如this、this、this、this和this),但最有趣的一个(对于我想在这里讨论的内容)是this,尽管它确实并没有真正解决我的问题。我想讨论的是以下警告:
\nwarning: defaulted move assignment for \xe2\x80\x98UG\xe2\x80\x99 calls a non-trivial move assignment operator for virtual base \xe2\x80\x98G\xe2\x80\x99.\n
Run Code Online (Sandbox Code Playgroud)\n在上一篇提到的帖子中,一位用户回答说这个警告是说基类可以移动两次,所以
\n\n\n第二个移动分配来自已移动的对象,\n这可能会导致第一个移动分配的内容\n被覆盖。
\n
我知道这是一个问题,最好避免。现在,我有几个类继承自纯虚拟基类。还涉及多重继承,并在下面的 MWE 中表示。我想要的是在需要时可以使用移动构造函数和移动赋值运算符,这样我就可以做
\nT t3;\nT t2 = std::move(t1);\nt3 = std::move(t2);\n
Run Code Online (Sandbox Code Playgroud)\n不用担心内存泄漏,并且所有内容都可以正确移动。目前,T t2 = std::move(t1);
工作正常,但t3 = std::move(t2);
不行。我制作了一个 MWE,它很好地代表了我的实际代码,并且我非常确信 MWE 的解决方案也将是我的代码的解决方案。MWE 为:
class G {\npublic:\n G() = default;\n G(G&&) = default;\n G(const G&) = default;\n virtual …
Run Code Online (Sandbox Code Playgroud)