Предполагая, что вы используете boost::python
, позвольте мне дать вам представление о том, как действовать в этих случаях.Вместо того, чтобы boost::python
автоматически переносить вашу функцию, вы предоставляете свою собственную упаковку:
namespace {
void Foo_methodUsingDate( Foo* pointer, const object& dateObject )
{
boost::gregorian::date date = convertFromPython( dateObject );
pointer->methodUsingDate( date );
}
}
void wrap_Foo()
{
class_< Foo >( "Foo" )
.def( "bar",
& Foo::bar
)
.def( "foobar",
& Foo::foobar
)
.def( "methodUsingDate",
& Foo_methodUsingDate
)
;
}
Конечно, вам нужно предоставить метод, который преобразует boost::python::object
в boost::gregorian::date
объект.Вы должны решить, как справиться с этим.Например, вы можете предположить, что параметр представляет собой последовательность из трех целых чисел, или вы можете разрешить более сложный способ передачи параметров, или определить новый класс, который переносит григорианскую дату и весь ее метод и предоставляет его непосредственно Python.
Что касается вашего первого вопроса, при использовании boost::python
std::string
s автоматически преобразуются в / из строк Python.