Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

How can I wrap functions which take C++ containers as arguments?

Boost , Boost.Python , Chapter 4. Frequently Asked Questions (FAQs)

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Ральф В. Гросс-Кунстлве приводит следующие примечания:

  1. Используя обычную<class_<>>обертку:

    <
    class_<std::vector<double>>("std_vector_double")
     .def(...)
     ...
    ;
    
    >

    Это может быть перемещено в шаблон так, что несколько типов (<double>,<int>,<long>и т.д.) могут быть обернуты одним и тем же кодом. Этот метод используется в файле<scitbx/include/scitbx/array_family/boost_python/flex_wrapper.h>в пакете «scitbx». Файл может быть легко изменен для обертывания<std::vector<>>. Этот тип связывания C++/Python наиболее подходит для контейнеров, которые могут содержать большое количество элементов (>10000).

  2. Использование пользовательских преобразователей значений. Повышаю. Python «конвертеры значений» соответствуют подписям функций, таким как:

    <
    voidfoo(std::vector<double>const&array);// pass by const-reference
    voidfoo(std::vector<double>array);// pass by value
    
    >

    Некоторые пользовательские конвертеры значений реализуются в файле<scitbx/include/scitbx/boost_python/container_conversions.h>Этот код может быть использован для преобразования из типов контейнеров C++, таких как<std::vector<>>или<std::list<>>, в наборы Python и наоборот. Несколько простых примеров можно найти в файле<scitbx/array_family/boost_python/regression_test_module.cpp>Automatic C++ container<->Python tuple conversions наиболее подходят для контейнеров умеренного размера. Эти преобразователи генерируют значительно меньше объектного кода по сравнению с альтернативой 1 выше.

Недостатком использования альтернативы 2 является то, что операторы, такие как арифметика +,-,*,/,%, недоступны. Было бы полезно иметь пользовательские преобразователи rvalue, которые преобразуются в тип «math_array» вместо кортежей. В настоящее время это не реализовано, но возможно в рамках Boost. Python V2 выйдет в ближайшие несколько недель. [ed.: он был опубликован в 2002/03/10 году]

Также было бы полезно иметь «обычные конвертеры lvalue», такие как<std::vector<>><->список Python. Эти преобразователи будут поддерживать изменение списка Python на C++. Например:

C++:

void foo(std::vector<double> &array)
{
  for(std::size_t i=0;i&lt;array.size();i++) {
    array[i] *= 2;
  }
}

Python:

>>> l = [1, 2, 3]
>>> foo(l)
>>> print l
[2, 4, 6]

Пользовательские преобразователи lvalue требуют внесения изменений в Boost. Базовая библиотека Python в настоящее время недоступна.

P.S.

Файлы «scitbx», упомянутые выше, доступны через анонимные CVS:

cvs -d:pserver:anonymous@cvs.cctbx.sourceforge.net:/cvsroot/cctbx login
cvs -d:pserver:anonymous@cvs.cctbx.sourceforge.net:/cvsroot/cctbx co scitbx

PrevUpHomeNext

Статья How can I wrap functions which take C++ containers as arguments? раздела Boost.Python Chapter 4. Frequently Asked Questions (FAQs) может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 4. Frequently Asked Questions (FAQs) ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:15:17/0.0087180137634277/1