14 Aralık 2016 Çarşamba

python'dan C++ Kullanmak

Giriş
Şu satırı dahil ederiz.
#include <boost/python.hpp>
Kolay kullanım için şu satırları dahil ederiz.
namespace bp = boost::python;
namespace bpn = boost::python::numeric;
BOOST_PYTHON_MODULE
Şu satırı dahil ederiz.
#include <boost/python/module.hpp>
Şöyle yaparız.
BOOST_PYTHON_MODULE (libdtlinux) {
  ...
}
class_ Sınıfı
default constructor
Template parametresi C++ sınıfının ismidir. Tırnak içinde ise Python'da kullanılan isim belirtilir.Şöyle yaparız.
BOOST_PYTHON_MODULE (libdtlinux) {
  using namespace boost::python;
  class_<DtSearch>("DtSearch")
    ...;
}
Şöyle de yapılabilir.
class_<A>("A", init<>())
  ... 
;
constructor + noncopyable
Eğer A sınıfı kopyalanamazsa şöyle yaparız.
class_<A, noncopyable>("A", init<>())
  ...
;
constructor + Held Type
Elimizde bir typedef olsun
class MyFuture {
public:
    virtual bool isDone() = 0;
    virtual const std::string& get() = 0;
    virtual void onDone(MyCallBack& callBack) = 0;
    virtual ~MyFuture() { /* empty */ } 
};

typedef boost::shared_ptr<MyFuture> MyFuturePtr;
Şöyle yaparız.
class_<MyFuture, boost::shared_ptr<MyFuture>, boost::noncopyable>("MyFuture")
parameter constructor
Elimizde parametre alan şöyle bir sınıf olsun.
MyClass
{
  T val;

public:
  MyClass(const T& tVal) : val(tVal) {}

  T    getVal()              { return val; }
  void setVal(const T& tVal) { val = tVal; }
};
Python'daki isimden sonra constructor'ın parametre aldığını belirtmek için init metodu kullanılır. Şöyle yaparız.
template <class T>
void bind_MyClass(const char* name) {
  class_<MyClass<T>>(name, init<T const&>())
    ...
    ;
}
Şöyle yaparız.
bind_MyClass<float>("MyClassFloat");
bind_MyClass<double>("MyClassDouble");
add_property metodu
Şöyle yaparız.
template <class T>
void bind_MyClass(const char* name) {
  class_<...>(...,...)
    .add_property("val", &MyClass<T>::getVal, &MyClass<T>::setVal);
    ;
}
def metodu
Şu satırı dahil ederiz.
#include <boost/python/def.hpp>
Şöyle yaparız.
BOOST_PYTHON_MODULE (libdtlinux) {
  using namespace boost::python;
  class_<...>("...")
    .def("DoSearch", &DtSearch::DoSearch)
    .def("CreateIndex", &DtSearch::CreateIndex);
}
list Sınıfı
Şöyle tanımlarız.
boost::python::list<boost::python::tuple>
tuple Sınıfı
Elemanlara erişmek için şöyle yaparız.
boost::python::extract<int>( )



Hiç yorum yok:

Yorum Gönder