Boost.Python多态性。羽绒铸造问题

时间:2014-10-14 06:59:20

标签: python c++ boost

我有一个C ++基类列表,我想在Python中访问它们作为派生大多数类的列表。

在Boost.Python中是否有构建方式来满足此要求?

我已经为我面临的问题做了一个例子:

// ------------------------------- Code ----------------------------------//
#include<memory>
#include<iostream>
#include<vector>
namespace boost { template<class T> T* get_pointer(std::shared_ptr<T>& p){ return p.get(); }}

struct Vehicle{ virtual ~Vehicle(){} friend bool operator==(const Vehicle& lhs, const Vehicle& rhs) { return true; }};
struct Boat: public Vehicle{ 
    virtual ~Boat(){} 
    friend bool operator==(const Boat& lhs, const Boat& rhs) { return true; }
    char const* testBoatSpecificMethod() { return "Floating."; }    
};
struct Truck: public Vehicle{ 
    virtual ~Truck(){} 
    friend bool operator==(const Truck& lhs, const Truck& rhs) { return true; }
    char const* testTruckSpecificMethod() { return "Trucking."; }
};

class Garage
{
public:
    Garage() {};
    ~Garage() {};
    char const* test() {  std::string temp = "Vehicle List Size: " + std::to_string(m_VehicleList.size()); return temp.c_str(); }
    friend bool operator==(const Garage& lhs, const Garage& rhs) { return true; }
    std::vector<std::shared_ptr<Vehicle>>& vehicleList() { return m_VehicleList; }
private:
    std::vector<std::shared_ptr<Vehicle>> m_VehicleList;
};

#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp> 
BOOST_PYTHON_MODULE(garage_ext)
{
    using namespace boost::python;
    class_<Garage>("Garage")
        .def("test", &Garage::test)
        .def("vehicleList", &Garage::vehicleList, return_internal_reference<1>());
    class_<Vehicle,std::shared_ptr<Vehicle>>("Vehicle");
    class_<Boat,std::shared_ptr<Boat>,bases<Vehicle>>("Boat")
        .def("testBoatSpecificMethod", &Boat::testBoatSpecificMethod);
    class_<Truck,std::shared_ptr<Truck>,bases<Vehicle>>("Truck")
        .def("testTruckSpecificMethod", &Truck::testTruckSpecificMethod);   

    implicitly_convertible<std::shared_ptr<Boat>,std::shared_ptr<Vehicle>>();
    implicitly_convertible<std::shared_ptr<Truck>,std::shared_ptr<Vehicle>>();
    class_<std::vector<std::shared_ptr<Vehicle>> >("stl_vector_Vehicle")
       .def(vector_indexing_suite<std::vector<std::shared_ptr<Vehicle>> >());
}

// --------------------------- Test Script -------------------------------//
import garage_ext
g = garage_ext.Garage()
l = g.vehicleList()
l.append(garage_ext.Boat())
print "Expecting a Boat object:"
print str(l[0])
print g.vehicleList()[0].testBoatSpecificMethod()
garage_ext.f2("Done.")

// ------------------------------输出-------------- ------------------- //

期待一个船对象 Traceback(最近一次调用最后一次):   文件&#34; test_garage.py&#34;,第7行,in     print g.vehicleList()[0] .testBoatSpecificMethod() AttributeError:&#39; Vehicle&#39;对象没有属性&#39; testBoatSpecificMethod&#39;

&#39;车载&#39;对象没有属性&#39; testBoatSpecificMethod&#39; 在这里,我希望Vehicle成为Boat对象。

如果没有内置或推荐/已知Boost.Python意味着处理此问题, 我将尝试使用get访问器返回一个boost :: python :: list来包装列表(很多包装然后在我的库中完成。),将派生的大多数类型存储在python列表对象中。通过调用overriden&#39; getAsDerivedClass&#39;来获取派生的大多数类型。方法。 我想避免这个。我不喜欢将python使用特定方法添加到库中,用于我们的设计和视觉值/原因。另一个问题是这种方式会引入很多额外的维护工作。

修改 当我使用原始指针而不是智能指针时,我想要的是什么。 对于我认为显而易见的原因,我不想使用原始指针代替智能指针。 这确实让我感到宽慰,知道我想要什么,这个概念并不像我开始担心的那么牵强。 (我仍然在努力使其与智能指针一起工作.python对象要求转换器,过多的工作要手工编写。)

0 个答案:

没有答案