1

boost.python を使用して、一連の C++ クラスを Python に公開しようとしています。これらのクラスは、純粋仮想メソッドと共有ポインターを組み合わせて、ポリモーフィズムによって一貫したインターフェイスを実現し、いくつかの単純なメモリ管理を実行します (これで十分です)。完全なソースは次のとおりです。

// 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 に公開することができず、実際にコンパイルできるものを思いつくことができませんでした。私はさまざまな順列を試しましたが、最近では上記のソースに示されている試みです (コンパイルされません)。何か案は?

4

0 に答える 0