Я думаю, что есть несколько способов, которые легче осуществить, чем написать собственный конвертер.Вы можете использовать boost :: python's map_indexing_suite, чтобы сделать преобразование для вас, или вы можете использовать ключевые аргументы в python.Я лично предпочитаю аргументы ключевых слов, так как это более «Pythonic» способ сделать это.
Так что это ваш класс (я добавил typedef для карты):
typedef std::map<std::string, double> MyMap;
class myClass {
public:
// Constructors - set a-f to default values.
void SetParameters(MyMap &);
private:
double a, b, c, d, e, f;
};
Примерusing map_indexing_suite:
#include <boost/python/suite/indexing/map_indexing_suite.hpp>
using boost::python;
BOOST_PYTHON_MODULE(mymodule)
{
class_<std::map<std::string, double> >("MyMap")
.def(map_indexing_suite<std::map<std::wstring, double> >() );
class_<myClass>("myClass")
.def("SetParameters", &myClass::SetParameters);
}
Пример использования аргументов ключевого слова.Для этого необходимо использовать обёртку raw_function:
using namespace boost::python;
object SetParameters(tuple args, dict kwargs)
{
myClass& self = extract<myClass&>(args[0]);
list keys = kwargs.keys();
MyMap outMap;
for(int i = 0; i < len(keys); ++i) {
object curArg = kwargs[keys[i]];
if(curArg) {
outMap[extract<std::string>(keys[i])] = extract<double>(kwargs[keys[i]]);
}
}
self.SetParameters(outMap);
return object();
}
BOOST_PYTHON_MODULE(mymodule)
{
class_<myClass>("myClass")
.def("SetParameters", raw_function(&SetParameters, 1));
}
, что позволяет вам писать такие вещи на Python:
A.SetParameters(a = 2.2, d = 4.3, b = 9.3)