Python ctypes: перенос класса C ++ с операторами

Я хочу обернуть небольшой тестовый класс C ++ для использования в Python с использованием ctypes. Класс называется Edge и имеет оператор сравнения друзей (==). У меня возникают трудности с реализацией функции сравнения в коде Python-обертки.

Сжатый Edge заголовок:

class Edge {
private:
int p1, p2;
public:
Edge(const int pp1, const int pp2);
~Edge(){};
friend bool operator==(const Edge &e1, const Edge &e2);
};

Написанная мной оболочка Python:

from ctypes import *
lib = cdll.LoadLibrary('./libedge.so')

lib.Edge_new.argtypes = [c_int, c_int]
lib.Edge_new.restype = c_void_p

lib.compare_edge.argtypes = [c_void_p, c_void_p]
lib.compare_edge.restype  = c_boolclass Edge(object):
def __init__(self, pp1, pp2):
self.obj = lib.Edge_new(c_int(pp1), c_int(pp2))

def __eq__(self, other):
return lib.compare_edge(self.obj, c_void_p(other))

Где Edge_new и compare_edge являются подпрограммами C ++, которые определены как:

#include "Edge.hpp"
extern "C" {
Edge* Edge_new(const Int32 pp1, const Int32 pp2) { return new Edge(pp1, pp2); }

bool compare_edge(Edge *e1, Edge *e2) {
return *e1 == *e2;
}
}

Конструктор работает отлично. Когда я сравниваю два краевых объекта e1 == e2 Я получаю следующую ошибку:

Traceback (most recent call last):   File "Edge.py", line 21, in <module>
print e1 == e2   File "Edge.py", line 16, in __eq__
return lib.compare_edge(self.obj, c_void_p(other)) TypeError: cannot be converted to pointer

Я понимаю, что означает ошибка, и, скорее всего, почему что-то идет не так, но я не знаю, как это исправить. Я компилирую код C ++ с помощью gcc 4.7, и интерпретатор Python является 64-битным.

2

Решение

Проблема в том, что вы пытаетесь привести объект Python к void *, а не void * вы уже привязаны к этому объекту obj приписывать.

Это должно быть так же просто, как изменить …

def __eq__(self, other):
return lib.compare_edge(self.obj, c_void_p(other))

…чтобы …

def __eq__(self, other):
return lib.compare_edge(self.obj, other.obj)

Явный вызов c_void_p должно быть ненужным, так как вы уже объявили типы в строке …

lib.compare_edge.argtypes = [c_void_p, c_void_p]
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector