Boost Python:在函数中通过引用传递变量时出错

时间:2017-11-14 22:27:20

标签: python c++ boost-python

我想了解为什么以下函数在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&安培;

1 个答案:

答案 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'