Перегруженный конструктор Boost.python для массива и списка питонов - PullRequest
3 голосов
/ 19 апреля 2011

Учитывая класс C ++, предоставляемый с помощью Boost.Python, как я могу предоставить два конструктора:

  • один, который принимает массив с пустым массивом, и
  • другой, который принимает список Python?

1 Ответ

5 голосов
/ 19 апреля 2011

Я не на 100% понимаю, что вы имеете в виду, но я предполагаю, что вы хотите, чтобы конструктор брал список Python, а другой - массив с нулевыми значениями.Есть несколько способов сделать это.Самый простой способ - использовать функцию make_constructor и перегрузить ее:

using boost;
using boost::python;

shared_ptr<MyClass> CreateWithList(list lst)
{
    // construct with a list here
}

shared_ptr<MyClass> CreateWithPyArrayObject(PyArrayObject* obj)
{
    // construct with numpy array here
}


BOOST_PYTHON_MODULE(mymodule)
{
    class_<MyClass, boost::noncopyable, boost::shared_ptr<MyClass> >
        ("MyClass", no_init)
        .def("__init__", make_constructor(&CreateWithList))
        .def("__init__", make_constructor(&CreateWithPyArrayObject))
}

Вы можете быть еще умнее и использовать произвольный тип / количество аргументов в своем конструкторе.Для этого требуется немного вуду.См. http://wiki.python.org/moin/boost.python/HowTo#A.22Raw.22_constructor, чтобы узнать, как представить необработанное определение функции в качестве конструктора.

...