Extract<T> может использоваться для извлечения значения произвольного типа C++ из экземпляра объект. Поддерживаются два использования:
Extract<T>(o) является временным объектом, который неявно конвертируется в T (эксплицитное преобразование также доступно через оператора функции объекта). Однако, если нет конверсии, которая может конвертировать o в объект типа T, будет увеличено исключение Python TypeError.
Extract<T>x(o); строит экстрактор, чья функция проверка() может быть использована для того, чтобы спросить, доступна ли конверсия без исключения.
Хранит указатель на объект Python, управляемый его аргументом конструктора. В частности, контрольный счет объекта не увеличивается. Он должен быть уверен, что он не разрушается до того, как будет названа функция преобразования экстрактора.
Преобразует сохраненный указатель в result_type, который является T или T const&.
Returns
Объект результата_типа, соответствующий тому, на который ссылается сохраненный указатель.
Throws
error_already_set и устанавливает TypeError, если такое преобразование отсутствует. Может также выделять другие неуказанные исключения, выброшенные конвертером, который фактически используется.
boolcheck()const;
Postconditions
Нет. В частности, обратите внимание, что возвратное значение истинного не исключает того, что исключение выбрасывается из результата_тип() или оператора(()).
Returns
ложные только в том случае, если нет конвертации из сохраненного указателя в T.
#include<cstdio>usingnamespaceboost::python;intPrint(strs){// extract a C string from the Python string objectcharconst*c_str=extract<charconst*>(s);// Print it using printfstd::printf("%s\n",c_str);// Get the Python string's length and convert it to an intreturnextract<int>(s.attr("__len__")())}
Следующий пример показывает, как экстракт может быть использован вместе с класс_<...> для создания и доступа к экземпляру завернутого класса C++.
structX{X(intx):v(x){}intvalue(){returnv;}private:intv;};BOOST_PYTHON_MODULE(extract_ext){objectx_class(class_<X>("X",init<int>()).def("value",&X::value));// Instantiate an X object through the Python interface. // Its lifetime is now managed by x_obj.objectx_obj=x_class(3);// Get a reference to the C++ object out of the Python objectX&x=extract<X&>(x_obj);assert(x.value()==3);}
Статья Chapter 5. To/From Python Type Conversion раздела Boost.Python Reference Manual Boost.Python Reference Manual может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.