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 ...
感到非常困惑。我怀疑你是否想要内部的<map>
一个?
谢谢。我会删除它。由于网络上有许多示例。
【参考方案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 和 std::vector 的优点? [关闭]