暴露C++升压::变量到Python的错误

2024-09-28 22:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我必须公开Boosi::变体& lt;BoL,无符号int,STD:::String,Boosi::asI::IP::地址,STD::vector & gt;从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>();
    }

我有以下错误。我搜索了一下,但没有一个有效的解决办法。在

^{pr2}$

Tags: toreturnobjectincludevaluedefwrappervariant
2条回答

是一种在Python Boost中公开C++变体的方法,是:

  1. 包在课堂上
  2. 代码集和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);
}

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

return boost::python::object(
    boost::python::handle<>(
        variant_to_object::convert(variant_)));

相关问题 更多 >