Экспорт boost :: asio :: ip :: address operator == в python

Я пытаюсь экспортировать boost :: asio :: ip :: address в python с помощью boost python. Большая часть экспорта классов довольно тривиальна для моих нужд, поскольку это простые функции-члены.

Однако, когда я прихожу к экспорту операторов сравнения, я вижу, что они определены следующим образом:

friend bool operator==(const address& a1, const address& a2)

Этот синтаксис AFAIK объявляет оператор как функцию, не являющуюся членом, а как функцию пространства имен. (что делает его недоступным для Python)

Есть ли способ настроить boost-python, чтобы экспортировать это в оператор cmp, чтобы позволить python сравнивать эти объекты для меня? Или у меня есть единственный вариант написать некую оболочку для этого класса на C ++ и реализовать там правильные функции сравнения членов?


person Max Shifrin    schedule 25.01.2016    source источник


Ответы (1)


На самом деле boost :: python делает это довольно просто. Фактически вы можете экспортировать любую функцию как член класса, если она принимает ссылку на класс в качестве своего первого параметра. Вот простой пример:

#include <boost/python.hpp>
using boost::python;

struct Test
{
    int i;
};

bool operator==(const Test& t1, const Test& t2)
{
    return t1.i == t2.i;
}

BOOST_PYTHON_MODULE(test)
{
    class_<Test>("Test")
        .def_readwrite("i", &Test::i)
        .def(self == self);
}

Вуаля! Это все, что вам нужно.

person Aleksey Vitebskiy    schedule 27.01.2016