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’
我不确定如何解决这个错误,有人知道吗?
这似乎在以下 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
我正在尝试包装一个使用 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’
我不确定如何解决这个错误,有人知道吗?
这似乎在以下 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