метод экспонирования с неподписанным символом & amp; аргумент с использованием Boost.Python

Я имею C ++ библиотеку с закрытым исходным кодом, которая предоставляет заголовочные файлы с кодом, эквивалентным:

class CSomething
{
public:
void getParams( unsigned char & u8OutParamOne,
unsigned char & u8OutParamTwo ) const;
private:
unsigned char u8OutParamOne_,
unsigned char u8OutParamTwo_,
};

Я пытаюсь представить это Python, мой код оболочки выглядит примерно так:

BOOST_PYTHON_MODULE(MySomething)
{
class_<CSomething>("CSomething", init<>())
.def("getParams", &CSomething::getParams,(args("one", "two")))

}

Теперь я пытаюсь использовать это в Python, который терпит неудачу:

one, two = 0, 0
CSomething.getParams(one, two)

Что приводит к:

ArgumentError: Python argument types in
CSomething.getParams(CSomething, int, int)
did not match C++ signature:
getParams(CSomething {lvalue}, unsigned char {lvalue} one, unsigned char {lvalue} two)

Что мне нужно изменить в коде оболочки Boost.Python или в коде Python, чтобы он работал? Как добавить магию Boost.Python для автоматического приведения PyInt в unsigned char и наоборот?

1

Решение

Boost.Python жалуется на пропавших без вести lvalue параметр, концепция которого не существует в Python:

def f(x):
x = 1

y = 2
f(y)
print(y) # Prints 2

x Параметр f функция не является C ++ — подобной ссылкой. В C ++ вывод другой:

void f(int &x) {
x = 1;
}

void main() {
int y = 2;
f(y);
cout << y << endl; // Prints 1.
}

У вас есть несколько вариантов здесь:

а) обернуть CSomething.getParams Функция для возврата кортежа новых значений параметров:

one, two = 0, 0
one, two = CSomething.getParams(one, two)
print(one, two)

б) обернуть CSomething.getParams функция для принятия экземпляра класса в качестве параметра:

class GPParameter:
def __init__(self, one, two):
self.one = one
self.two = two

p = GPParameter(0, 0)
CSomething.getParams(p)
print(p.one, p.two)
1

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

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