Boost.Python:无法包装 C++ "operator<<" 以在 Python 中公开打印功能

Boost.Python: Unable to wrap C++ "operator<<" to expose print functionality in Python

我正在尝试包装一个使用 Boost.Python 处理二进制值的 C++ class。对于此 class,“<<”运算符已定义为

std::ostream &operator<<(std::ostream &output, const bin &inbin);

我试过用

包裹它
class_<bin>("bin", init<>())
    .def(str(self));

但是,编译会抛出这个错误:

boost/python/def_visitor.hpp:31:9: error: no matching function for call to
‘boost::python::api::object::visit(boost::python::class_<itpp::bin>&) const’

我不确定如何解决这个错误,有人知道吗?

参考:http://www.boost.org/doc/libs/1_31_0/libs/python/doc/tutorial/doc/class_operators_special_functions.html

这似乎在以下 SO 帖子中有所涉及:
what is wrong with c++ streams when using boost.python?
Build problems when adding `__str__` method to Boost Python C++ class

所以,根据之前的帖子,你应该尝试替代

.def(str(self));  

.def(self_ns::str(self)); 

.def(self_ns::str(self_ns::self))  

在那些情况下,它似乎解决了同样的问题。

如果上述方法不起作用,请尝试编写自定义包装器。例如,您可以将 print_wrap 函数定义为:

#include <sstream>
std::string print_wrap(const classname &c)
{
  std::ostringstream oss;
  oss << "HelloWorld " << c.var1 << " " << c.var2;
  return oss.str();
}

然后在class_<classname>("py_classname")定义中使用,

.def("__str__", &print_wrap)

那么在Python你应该可以得到

>>> obj = py_classname(1,2)  #var1=1, var2=2
>>> print obj
>>> HelloWorld 1 2