小编llu*_*lpu的帖子

SWIG 和 C++ 枚举类

编辑这个答案解决了问题,但最后我提出了一个更加模块化的解决方案。一探究竟 :)

我从两次 讨论中知道,为了类型安全,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)

c++ enums swig python-3.x

5
推荐指数
1
解决办法
2548
查看次数

移动赋值运算符和虚拟继承

像我这样的类似问题已经在这个社区中讨论过(有几个帖子,比如thisthisthisthisthis),但最有趣的一个(对于我想在这里讨论的内容)是this,尽管它确实并没有真正解决我的问题。我想讨论的是以下警告:

\n
warning: 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 中表示。我想要的是在需要时可以使用移动构造函数和移动赋值运算符,这样我就可以做

\n
T 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 为:

\n
class G {\npublic:\n    G() = default;\n    G(G&&) = default;\n    G(const G&) = default;\n    virtual …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance multiple-inheritance move-semantics

5
推荐指数
1
解决办法
1741
查看次数