Программирование высшего порядка с использованием Boost :: Python

Итак, у меня есть простая библиотека событий, написанная на C ++ и использующая библиотеки Boost. Я хотел открыть указанную библиотеку для Python, поэтому, естественно, я обратился к Boost :: Python. В конце концов, у меня есть код для компиляции, но теперь я столкнулся с серьезной проблемой: моя библиотека использует методы программирования более высокого порядка. Например, библиотека состоит из трех основных классов: класса событий, класса диспетчера событий и класса прослушивателя событий. Класс слушателя событий создает проблему. Код:

    class listener{
        public:
            listener(){}
            void alert(cham::event::event e){
                if (responses[e.getName()])
                    responses[e.getName()](e.getData());
            }
            void setResponse(std::string n, boost::function<void (std::string d)> c){responses.insert(make_pair(n, c));}
            void setManager(_manager<listener> *m){manager = m;}
        private:
            std::map<std::string, boost::function<void (std::string d)> > responses;
            _manager<listener> *manager;

Как видите, проблема связана с функцией setResponse . Он требует, чтобы ему была передана функция, и, к сожалению, Boost :: Python не применяет магию преобразователя в этой ситуации. При вызове, подобном следующему:

>>> import chameleon
>>> man = chameleon.manager()
>>> lis = chameleon.listener()
>>> def oup(s):
...  print s
... 
>>> lis.setResponse("event", oup)

, выдается следующая ошибка:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
    listener.setResponse(listener, str, function)
did not match C++ signature:
    setResponse(cham::event::listener {lvalue}, std::string, boost::function<void ()(std::string)>)

Итак, мой вопрос, как я могу это исправить? Придется использовать либо перегрузку, либо оболочку, поскольку я хотел бы, чтобы библиотека оставалась вызываемой с помощью C ++.

6
задан Samuel Breese 27 February 2012 в 21:55
поделиться