将C ++ boost :: variant暴露给Python时出错

问题描述 投票:1回答:2

我正在编写一个Python模块,需要在其中访问C ++库。我正在使用Boost-Python将C ++库中实现的功能公开给Python。

我必须公开boost :: variant 从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_);
python c++11 boost-python
2个回答
0
投票

以下是用于在Python Boost中公开C ++变体的方法是:

  1. 包装在类中
  2. 代码SET和GET方法
  3. 公开Python Boost模块中的类。

包括

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);
}

0
投票

根据the Boost.Python manual,您可以使用boost::python::objectPyObject*(您的convert函数返回)构造一个boost::python::handle<>()。当我用此代码替换您的getValue()函数时,它将编译:

return boost::python::object(
    boost::python::handle<>(
        variant_to_object::convert(variant_)));
© www.soinside.com 2019 - 2024. All rights reserved.