Ошибки в представлении C ++ Boost :: Вариант для Python - PullRequest
0 голосов
/ 03 февраля 2019

Я пишу модуль 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_);

1 Ответ

0 голосов
/ 05 февраля 2019

Ниже приведен метод, который работал для предоставления варианта C ++ в Python Boost:

  1. Обтекание в классе
  2. Методы Code SET и GET
  3. Exposeмодуль в Python Boost Module.

включает

using namespace std;

boost::variant<int, string, bool> v;
typedef boost::variant<int, string, bool> myvar;

class VariantClass
{
    public:
        myvar x = "hello";
    myvar y = 20;
    myvar z = false;

   void setString(string n){
    x = n;   
   }

   void setInt(int n){
    y = n;      
   }

   void setBool(bool n){
    z = n;        
   }

   string getString(){
    string s = boost::get<string>(x);    
    return s;  
    }

   int getInt(){
    int i = boost::get<int>(y);      
    return i;
    }

   bool getBool(){
    bool b = boost::get<bool>(z);   
    return b;     
    }

   string greet() { return "Hello World Test!"; }
};

//using namespace boost::python;

BOOST_PYTHON_MODULE(bpv)
{
    using namespace boost::python;

    class_<VariantClass>("VariantClass", init<>())
        .def("setString", &VariantClass::setString)
    .def("setInt", &VariantClass::setInt)
    .def("setBool", &VariantClass::setBool)
    .def("getString", &VariantClass::getString)
    .def("getInt", &VariantClass::getInt)
    .def("getBool", &VariantClass::getBool)
    .def("greet", &VariantClass::greet);
}
...