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