Cython C++ 和 std::map 处理

Posted

技术标签:

【中文标题】Cython C++ 和 std::map 处理【英文标题】:Cython C++ and std::map handling 【发布时间】:2019-10-07 14:11:04 【问题描述】:

我正在尝试将我的 C++ 类与 Cython 接口,但难以作为参数传递 std::map。

sample.pxd 文件:

from libcpp cimport bool
from libcpp cimport string
from libcpp cimport map
from libcpp.utility cimport pair


cdef extern from "../SampleProg.h":
        cdef extern from "<map>" namespace "std":
            cdef cppclass SampleProg:
            SampleProg() except +

            void setInitialTemplateParameters(map[string,XdmValue*] parameters, bool tunnel)

            # Get all parameters as a std::map
            map[string,XdmValue*]& getParameters()

            # Get all properties as a std::map
            map[string,string]& getProperties()

sampleProg.pyx 文件:

cimport sampleProg
from libcpp cimport bool
from libcpp cimport map
from libcpp.utility cimport pair
from libcpp cimport string

cdef class PySampleProg:

     def set_initial_template_parameters(self, bool tunnel, **kwds):

        cdef map[str, PyXdmValue ] parameters
        cdef bool c_tunnel
        c_tunnel = tunnel
        cdef PyXdmValue value_
        for key, value in kwds.items():
                if isinstance(value, PyXdmValue):
                        value_ = value
                        parameters[key] = value_.thisvptr

        if len(kwds) > 0:
            self.setInitialTemplateParameters(parameters, c_tunnel);

我似乎找不到在 cython 中构建映射以传递给 C++ 的示例。我在 pxd 和 pyx 文件中都收到此错误:

void setInitialTemplateParameters(map[string,XdmValue*] 参数, 布尔隧道)

^

sampleProg.pxd:186:46: 'map' 不是类型标识符

【问题讨论】:

我对 pxd 文件中嵌套的 cdef extern from ... 感到非常困惑。我怀疑你是否想要内部的&lt;map&gt; 一个? 谢谢。我会删除它。由于网络上有许多示例。 【参考方案1】:

这看起来有点乱,可能离工作有点远。但是,您的“地图不是类型标识符”错误很容易解释。你想要:

from libcpp.map cimport map

(即from libcpp cimport map 只获取map.pxd 文件,而不是其中定义的map C++ 类)。这同样适用于string

【讨论】:

谢谢。现在继续前进。但我不得不将导入更改为以下内容:from libcpp.map cimport map 是的,你是对的。这是cimport 而不是import

以上是关于Cython C++ 和 std::map 处理的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::map

模板类值的 C++ std::map

C++ std::map 和 std::vector 的优点? [关闭]

C++ std::map 持有任何类型的值

C++ std::unordered_map 中使用的默认哈希函数是啥?

Cython -std=c++11 错误,同时使用 C 和 C++