如何将 Python Decimal 实例转换为 C++ double?

How do you convert a Python Decimal instance to a C++ double?

在 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";
}

但是我得到一个错误

No registered converter was able to produce a C++ rvalue of type double from this Python object of type decimal.Decimal

我该怎么做?我无法想象它有多复杂。显然我错过了一些东西。

您在 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 设计的优美方式,相当于专门化一个模板。