在Python本身中,您可以简单地写float(f)
,其中f
是Python小数。这产生了一个double
类型(在Python中称为float
)。
但是我需要在boost::python
中这样做。我的代码(删节)是
double toDouble(boost::python::object obj)
{
std::string type = boost::python::extract<std::string>(obj.attr("__class__").attr("__name__"));
std::string module = boost::python::extract<std::string>(obj.attr("__class__").attr("__module__"));
std::string cls = module + "." + type;
if (cls == "decimal.Decimal"){
double f = boost::python::extract<double>(obj);
return f;
}
throw "Oops";
}
但是我得到一个错误
没有注册的转换器能够产生类型为从这个十进制类型的Python对象中获取double。十进制
我该怎么做?我无法想象这有多复杂。很明显我漏掉了什么。
您需要在if
块中的代码为
static boost::python::object builtins
= boost::python::import("builtins");
static boost::python::object function
= boost::python::extract<boost::python::object>(builtins.attr("float"));
boost::python::object ret = function(obj);
double f = boost::python::extract<double>(ret);
我实际上是在使用Python函数float(obj)
。
从表面上看,你已经很熟悉boost::python::extract
了。
float
是一个内置python函数。见https://docs.python.org/3/library/functions.html。因此,第一个语句是导入包含内置函数的模块。第二个语句获取float
函数。
第三个调用它,在Boost文档"调用Python函数和方法"的行中。
你可以把这些放到一起寄存器这个提取,可能,知道Boost设计的美丽方式,相当于一个模板的专业化。