在vector temp中用嵌套枚举引用包装结构

2024-05-29 04:43:53 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一天半前的事了,但还没有得到任何回复,所以我在一个更普通的论坛上碰碰运气

我一直在尝试各种方法来包装下面的代码,但有不同程度的错误。大量的搜索让我遇到了类似的问题,也有一张很好的愿望票,但老实说,我甚至不确定我是否走在正确的道路上。在

犁类型。h:

namespace Plow {

    struct JobState {
      enum type {
        INITIALIZE = 0,
        RUNNING = 1,
        FINISHED = 2
      };
    };
    ...
    class JobFilterT {
     public:
      ...
      std::vector<JobState::type>  states;
      ...

所以我试图包装这个Plow::JobState::type枚举。在找到另一个类似的帖子后,我得到的最接近的结果是:

犁_类型.pxd:

^{pr2}$

我得到一个错误:

src/plow.cpp: In function ‘std::vector<Plow::JobState::type, std::allocator<Plow::JobState::type> > __pyx_convert_vector_from_py_enum__Plow_3a__3a_JobState_3a__3a_type(PyObject*)’:
src/plow.cpp:6688: error: invalid conversion from ‘long int’ to ‘Plow::JobState::type’

要么:

  1. 如何正确包装此嵌套枚举?在
  2. 是否有必要尝试将其完全包装起来,或者我可以通过其他方法实现访问这些“名称空间”常量的目标?我应该完全忽略这些结构,在pyx中用匹配的int值定义自己的常量版本吗?在

我试图在cythonpyx中简单地定义我自己版本的常量,并将所有内容都视为int(vector[int] states),但是编译器抱怨不知道如何从int long转换到{}。在


Tags: 方法src类型type错误enumcppint
1条回答
网友
1楼 · 发布于 2024-05-29 04:43:53

在尝试了难以置信的组合之后,我终于弄明白了。离我问这个问题的最后一次尝试不远了。。。在

犁_类型.pxd:

我需要忘记这个JobState结构,只包装枚举。但我还需要将它们映射到cython中的新名称,以避免与使用类似名称空间技术的其他枚举发生名称冲突。在

cdef extern from "rpc/plow_types.h" namespace "Plow":

    ctypedef enum JobState_type "Plow::JobState::type":
        JOBSTATE_INITIALIZE "Plow::JobState::INITIALIZE"
        JOBSTATE_RUNNING "Plow::JobState::RUNNING"
        JOBSTATE_FINISHED "Plow::JobState::FINISHED" 

现在我可以在vector[JobState_type]之类的东西中引用JobState_type。然后我使用这种方法以只读方式在python中提供常量:

作业.pyx:

^{pr2}$

这给了我一个JobState的公共实例,具有只读常量属性。在

当需要从python值列表转换回vector[JobState_type]时,我会这样做:

someList = [JobState.RUNNING]
...
cdef:
    JobState_type i
    vector[JobState_type] vec_states

for i in someList:
    vec_states.push_back(i)

相关问题 更多 >

    热门问题