gpt4 book ai didi

c++ - 通过引用传递时 std::vector 的转换器

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:59 24 4
gpt4 key购买 nike

这是后续问题 std::vector to boost::python::list

我尝试了提供的示例:

// C++ code
typedef std::vector<std::string> MyList;
class MyClass {
MyList myFuncGet();
void myFuncSet(MyList& list)
{
list.push_back("Hello");
}
};

// My Wrapper code
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>

using namespace boost::python;

BOOST_PYTHON_MODULE(mymodule)
{
class_<MyList>("MyList")
.def(vector_indexing_suite<MyList>() );

class_<myClass>("MyClass")
.def("myFuncGet", &MyClass::myFuncGet)
.def("myFuncSet", &MyClass::myFuncSet)
;
}

但是当我尝试在 Python 中实际使用它时,我得到了一个错误(见底部)。

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from mymoduleimport *
>>> mc = MyClass()
>>> p = []
>>> mc.myFuncSet(p)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
MyClass.myFuncSet(MyClass, list)
did not match C++ signature:
myFuncSet(MyClass {lvalue}, std::vector<std::string, std::allocator<std::string> > {lvalue})

根据我通过阅读各种其他网站和帖子所收集到的信息,需要一个转换器。有人可以通过添加必要的转换器代码来完成我的示例吗?我会自己做,但我对 boost 不够熟悉,不知道这样的转换器是什么样子。

提前致谢!

最佳答案

我相信您只能在按值或常量引用传递参数时使用转换器。通过非常量引用传递需要直接公开类型。这意味着如果你想将一个列表从 python 传递到 c++,而不复制列表项,你需要更改你的代码以使用 boost::python::list。而不是 MyList ,类似于(未测试)

void myFuncSet(boost::python::list& list)
{
list.append("Hello");
}

vector 索引套件将类似 python 列表的行为添加到您的 MyList 绑定(bind)中,它不允许您在其位置传递 python 列表。

您在示例中遇到的错误是因为您试图将 python 列表传递给采用 std::vector<int> 的函数。 .我怀疑这会起作用

p = mc.myFuncGet()
mc.myFuncSet(p)

这是一篇关于编写转换器的非常有用的文章。 http://misspent.wordpress.com/2009/09/27/how-to-write-boost-python-converters/

关于c++ - 通过引用传递时 std::vector 的转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8949690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com