Я пишу модуль Python, в котором мне нужно получить доступ к библиотеке C ++.Я использую Boost-Python для предоставления функциональности, реализованной в библиотеке C ++, Python.
Я должен выставить boost :: variable из C ++ в модуль Python.
Я написал код, который реализует функциональность, но у меня возникла ошибка.Я буду признателен, если кто-то поможет мне в решении проблем.
#include <boost/variant.hpp>
#include <boost/python/class.hpp>
#include <boost/python/def.hpp>
#include <boost/python/implicit.hpp>
#include <boost/python/init.hpp>
#include <boost/python/module.hpp>
#include <boost/python/object.hpp>
using myvariant = boost::variant<bool,int,std::string>;
struct variant_wrapper
{
struct variant_to_object : boost::static_visitor<PyObject *>
{
static result_type convert(myvariant const &v)
{
return apply_visitor(variant_to_object(), v);
}
template<typename T>
result_type operator()(T const &t) const
{
return boost::python::incref(boost::python::object(t).ptr());
}
};
myvariant variant_;
variant_wrapper ()
{}
variant_wrapper (myvariant& variant) : variant_(variant)
{}
void setAsBool(bool value)
{
variant_ = value;
}
void setAsString(const std::string& value)
{
variant_ = value;
}
boost::python::object getValue()
{
return variant_to_object::convert(variant_);
}
};
myvariant make_variant() { return myvariant(); }
BOOST_PYTHON_MODULE(pyintf) {
using namespace boost::python;
class_<variant_wrapper>("variant_wrapper", init<>())
.def("setAsBool",&variant_wrapper::setAsBool)
.def("setAsString",&variant_wrapper::setAsString)
.def("getValue", &variant_wrapper::getValue)
;
def("make_variant", make_variant);
to_python_converter<myvariant, variant_wrapper::variant_to_object>();
}
Я получаю следующую ошибку.Я искал, но ни одно из решений не работало здесь.
pyintf.cpp:132:51: error: could not convert ‘variant_wrapper::variant_to_object::convert((*(const myvariant*)(&((variant_wrapper*)this)->variant_wrapper::variant_)))’ from ‘boost::static_visitor<_object*>::result_type {aka _object*}’ to ‘boost::python::api::object’
return variant_to_object::convert(variant_);