boost python関数でオブジェクトを渡す

2370 ワード

classクラス
class XEventWarp:public XEvent
{
public:
	PyObject *self;
	XEventWarp(PyObject* self_):self(self_){ Py_INCREF(self); }
	XEventWarp( PyObject* self_, const XEvent& copy ) : XEvent(copy), self(self_) { Py_INCREF(self); }
	 ~XEventWarp() {Py_DECREF(self); }
	 
};

BOOST_PYTHON_MODULE(_core)
{
	class_<XEvent, auto_ptr<XEventWarp> >("XEvent")
		.def("Skip",&XEvent::Skip)
		.def("Stop",&XEvent::Stop)
		.def("__cmp__",&XEvent::Cmp)
		.add_property("wKeyState",&XEvent::GetWKeyState)
		.add_property("cpt",&XEvent::GetClientPos)
		.add_property("spt",&XEvent::GetScreenPos)
		.add_property("hWnd",&XEvent::GetHandler)
		.add_property("tick",&XEvent::GetTime)
		.add_property("lParam",&XEvent::GetLParam)
		.add_property("wParam",&XEvent::GetWParam)
	;
	implicitly_convertible<auto_ptr<XEventWarp>, auto_ptr<XEvent>>();
}

XEventは関数テンプレートをエクスポートし、OnEvent関数はVOID OnEvent(XEvent*evt)として定義されます.
虚関数なのでパッケージクラスを書く必要があります
class HWndObjectWapper:public HWndObject,public wrapper<HWndObject>
{

public:
	HWndObjectWapper(){}
	HWndObjectWapper(std::string className,std::string sbClassName)
		:HWndObject(className,sbClassName){}

	VOID OnEvent(XEvent* evt)
	{
		if(override function=this->get_override("OnEvent"))
		{
			//object obj(evt); 
			//function(obj); 
			reference_existing_object::apply<XEvent*>::type converter;
			PyObject* obj = converter(evt);
			object real_obj = object( handle<>( obj ) );
			function(real_obj);
		}
		else
		{
			this->HWndObject::OnEvent(evt);
		}
	};

	VOID OnFinalMessage()
	{
		if(override function=this->get_override("OnFinalMessage"))
		{
			function();
		}
		else
		{
			this->HWndObject::OnFinalMessage();
		}
	}

	VOID DefaultOnFinalMessage(){ HWndObject::OnFinalMessage();};
	VOID DefaultOnEvent(XEvent* evt){ HWndObject::OnEvent(evt);};


};
では、pyに渡されるobjectとC++objectバインドの2つの呼び出し方法があります.

reference_existing_object::apply::type converter; PyObject* obj = converter(evt); object real_obj = object( handle<>( obj ) ); function(real_obj);
関連付けが必要でない場合
object obj(evt); function(obj);
ダイレクトコール