在Python本身中,您只需编写Python小数点float(f)
在哪里f
。产生一个double
类型(float
在Python中称为a )。
但我需要在中执行此操作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";
}
但我得到一个错误
没有注册的转换器能够从此类型为October.Python的Python对象产生类型为double的C ++右值。
我该怎么做呢?我无法想象这很复杂。显然我缺少了一些东西。
您需要在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设计的优美方式,而不仅仅是专门设计模板。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句