使用Boost Python公开纯虚拟类层次结构

时间:2013-10-23 09:04:16

标签: c++ python polymorphism boost-python

我正在尝试使用boost.python向Python公开一组C ++类。这些类结合了纯虚方法和共享指针,通过多态实现一致的接口,并执行一些简单的内存管理(足够)。这是完整的来源:

// Boost stuff.
#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>

class RoutingInterface
{
public:

    virtual ~RoutingInterface()
    {
        // Do nothing.
    }

    virtual const char* begin(unsigned int& size, unsigned int limit) = 0;
    virtual const char* advance(const char* data, unsigned int& size, unsigned int limit) = 0;
    virtual void finish(const char* data) = 0;
};

class Route
{
public:

    virtual ~Route()
    {
        // Do nothing.
    }

    virtual RoutingInterface* get_interface() = 0;
    virtual void release_instance(RoutingInterface* instance) = 0;
};

class Router
{
public:

    // Useful types.
    typedef boost::shared_ptr<Route> route_ptr;

private:

    std::map<std::string, route_ptr> Routes;

public:

    // Working with routes.
    void add_route(std::string path, route_ptr route)
    {
        Routes[path] = route;
    }

    void remove_route(std::string path)
    {
        auto found = Routes.find(path);
        if(found != Routes.end())
        {
            // Found a nothing.
            Routes.erase(path);
        }           
    }

    route_ptr route_path(std::string path)
    {
        auto found = Routes.find(path);
        if(found != Routes.end())
        {
            // Found a nothing.
            return found->second;
        }

        // Found a nothing.
        return Router::route_ptr();
    }
};

BOOST_PYTHON_MODULE(http_server)
{
    class_<RoutingInterface, boost::noncopyable>("RoutingInterface", no_init)
        .def("get_interface", pure_virtual(&RoutingInterface::begin))
        .def("release_instance", pure_virtual(&RoutingInterface::advance))
        .def("release_instance", pure_virtual(&RoutingInterface::finish));

    class_<Route, boost::noncopyable>("Route", no_init)
        .def("get_interface", pure_virtual(&Route::get_interface),
            return_value_policy<reference_existing_object>())
        .def("release_instance", pure_virtual(&Route::release_instance));

    class_<Router, router_ptr>("Router", init<log_ptr>())
        .def("add_route", &Router::add_route)
        .def("remove_route", &Router::remove_route)
        .def("route_path", &Router::route_path,
            return_value_policy<reference_existing_object>());
}

我将实现从Route和RoutingInterface类继承的类,并由工厂方法构造,然后从Python调用。 Router类是一个存储路由的容器,允许从中搜索它们。

问题在于:我无法将所描述的3个类暴露给Python,并提出了一些实际编译的东西。我尝试了各种排列,最近的尝试是在上面的源代码中显示的(不编译)。有什么想法吗?

0 个答案:

没有答案