У меня есть функция C++, которая возвращает необработанный указатель float
, и другая функция C++, которая принимает необработанный указатель float
в качестве аргумента. Что-то типа:
float* ptr = something;
float* get_ptr(void) { return ptr; }
void use_ptr(float* ptr) { do_work(ptr); }
Я хочу иметь возможность передавать указатели с помощью Python. Что-то вроде этого:
import my_native_functions as native
ptr = native.get_ptr()
native.use_ptr(ptr)
Я использую pybind11 для создания собственного модуля Python, но я не знаю, как создать привязки для функции get_ptr()
. Если я просто сделаю следующее:
PYBIND11_MODULE(my_native_functions, m)
{
m.def("get_ptr", &get_ptr);
m.def("use_ptr", &use_ptr);
}
функция get_ptr()
возвращает объект Python Float
. Я думаю, это имеет смысл, потому что в python нет типов указателей. Однако, поскольку теперь это просто Float
, когда я вызываю функцию use_ptr()
и перебираю указатель в C/C++, только первый элемент массива является правильным. Остальное мусор. Чтобы исправить это, в C++ мне нужно привести указатель к/от std::size_t
. Делая это, все работает просто отлично.
Тем не менее, я хотел бы спросить: существует ли «правильный способ» достижения вышеизложенного без приведения к/от std::size_t
с помощью pybind11?
Если вам интересно, почему я это делаю: я понимаю, что то, что я делаю, небезопасно для типов. Кроме того, я никогда не касаюсь указателя/целого числа на стороне Python. Я просто извлекаю его из одного нативного модуля и передаю в другой. Кроме того, я не могу привести указатель к какому-то пустому представлению, потому что указатель не всегда находится на ЦП. Иногда я хочу передать указатели CUDA. Создание py::array_t
из указателя CUDA невозможно, если я не скопирую данные (а я не хочу этого делать).
Спасибо.