我想了解为什么以下函数在python中不起作用:
#include<boost/python.hpp>
#include<iostream>
#include<string>
void hello(std::string& s) {
std::cout << s << std::endl;
}
BOOST_PYTHON_MODULE(test)
{
boost::python::def("hello", hello);
}
当我将库导入python
时import test
test.hello('John')
我收到错误:
test.hello(str)
did not match C++ signature:
hello(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > {lvalue})
所有东西都只使用'std :: string s',但是我希望通过引用来对象而不复制它。我注意到任何其他函数弹出错误,例如引用INT&安培;
答案 0 :(得分:0)
正如kindall所述,python字符串是不可变的。一种解决方案可以是stl :: string包装器。您的python端会受到影响,但这是一个简单的解决方案,并且需要为该接口支付少量费用
class_<std::string>("StlString")
.def(init<std::string>())
.def_readonly("data", &std::string::data);
请注意,将 assign 运算符python转换为c ++ stl将由boost给出,但是您必须公开 data 成员才能访问存储的数据。我为c ++对象的外观添加了另一个构造函数。
>>> import test
>>> stlstr = test.StlString()
>>> stlstr
<test.StlString object at 0x7f1f0cda74c8>
>>> stlstr.data
''
>>> stlstr = 'John'
>>> stlstr.data
'John'
>>> initstr = test.StlString('John')
>>> initstr.data
'John'