LINUX.ORG.RU

История изменений

Исправление samson, (текущая версия) :

UPD:
Что нужно указать в .def(init<>) вместо std::function<bool()>?

Модуль собирается, но не передается указатель на функцию из python в C++.

class eventPython : public eventBase {
 public:
  eventPython(std::function<bool()>);
 private:
  std::function<bool()> evFunc;
  virtual bool run() override;
};

BOOST_PYTHON_MODULE(modulename) {
  class_<eventPython>("qcEv")

    /* ??? какой тут нужно указать тип вместо std::function<bool()> ??? */
    .def( init<std::function<bool()>>(args("eventFunc")) );
}

вполняем скрипт:

from modulename import qcEv
def pyFunc():
    print('python: pyFunc()')
    return True
e = qcEv(pyFunc)

Результат:

$ python test.py 
Traceback (most recent call last):                                                               
  File "test.py", line 14, in <module>                                                           
    e = qcEv(pyFunc)                                                                             
Boost.Python.ArgumentError: Python argument types in                                             
    qcEv.__init__(qcEv, function)                                                                
did not match C++ signature:                                                                     
    __init__(_object*, std::function<bool ()> eventFunc)                                         
    __init__(_object*) 

В предыдущем примере, обратно к std::function<> преобразуется: std::function<bool()> fptr2(d["pyFunc"]);

Исходная версия samson, :

UPD:
Что нужно указать в .def(init<>) вместо std::function<bool()>?

Модуль собирается, но не передается указатель на функцию из python в C++.

class eventPython : public eventBase {
 public:
  eventPython(std::function<bool()>);
 private:
  std::function<bool()> evFunc;
  virtual bool run() override;
};

BOOST_PYTHON_MODULE(modulename) {
  class_<eventPython>("qcEv")

    /* ??? какой тут нужно указать тип вместо std::function<bool()> ??? */
    .def( init<std::function<bool()>>(args("eventFunc")) );
}

вполняем скрипт:

from modulename import qcEv
def pyFunc():
    print('python: pyFunc()')
    return True
e = qcEv(pyFunc)

Результат:

$ python test.py 
Traceback (most recent call last):                                                               
  File "test.py", line 14, in <module>                                                           
    e = qcEv(pyFunc)                                                                             
Boost.Python.ArgumentError: Python argument types in                                             
    qcEv.__init__(qcEv, function)                                                                
did not match C++ signature:                                                                     
    __init__(_object*, std::function<bool ()> eventFunc)                                         
    __init__(_object*)