Как я могу наследовать от абстрактного базового класса Python, используя boost :: python? - PullRequest
0 голосов
/ 28 февраля 2019

Я хотел бы сделать dict -подобный объект для взаимодействия с c ++ std::map.Я понимаю, что в чистом Python лучший способ создания интерфейса dict - это наследовать от collections.MutableMapping и переопределять соответствующие методы (__getitem__, __setitem__ и т. Д.).

В моем случае, однако, я хотел бы взаимодействовать с map<string, string> в C ++, используя boost::python.

Теперь я знаю, что можно создать подкласс другого класса, который был создан в C ++ и зарегистрирован с использованием boostуказав bases<T> в конструкторе class_.Тем не менее, я не могу найти способ для моего класса DictInterface наследоваться от MutableMapping, чтобы использовать все дополнительные функции, предоставляемые абстрактным базовым классом.

#include <map>
#include <boost/python.hpp>

using namespace boost::python;

class DictInterface
{
public:
    DictInterface(std::map<std::string, std::string>& m)
    {
        cpp_map = m;
    }

    std::string getitem(const std::string& key) const
    {
        std::string ret = some_decoding(cpp_map.at(key));
        return ret;
    }

    void setitem(const std::string& key, const std::string& value)
    {
        cpp_map.insert_or_assign(key, some_encoding(value));
    }

    void delitem(const std::string& key)
    {
        if (cpp_map.find(key)) {
            cpp_map.erase(key);
        }
    }

    /* ...More methods... */

private:
    std::map<std::string, std::string>& cpp_map;
}

// Expose to python
void export_DictInterface_h()
{
    class_<DictInterface, /*here is where bases would go*/>
        .def("__getitem__", &DictInterface::getitem)
        .def("__setitem__", &DictInterface::setitem)
        .def("__delitem__", &DictInterface::delitem)
        // ... More method definitions ...
        // Is this where I could inherit from MutableMapping?
    ;
}
...