从std::function创建boost::python::object

4 投票
1 回答
1551 浏览
提问于 2025-04-17 04:10

我该如何从一个 std::function 创建一个 boost::python::object 呢?

1 个回答

6

使用 boost::python::make_function,并提供一个函数签名,因为默认的签名无法处理 std::function

举个例子,我们想要包装一个返回类型:

std::function<std::string(int, int)> get_string_function(const std::string& name)
{
    return [=](int x, int y)
    {
        return name + "(x=" + std::to_string(x) + ", y=" + std::to_string(y) + ")";
    };
}

我们可以定义一个包装器,并使用 def 来调用它:

boost::python::object get_string_function_pywrapper(const std::string& name)
{
    auto func = get_string_function(name);
    auto call_policies = boost::python::default_call_policies();
    typedef boost::mpl::vector<std::string, int, int> func_sig;
    return boost::python::make_function(func, call_policies, func_sig());
}

BOOST_PYTHON_MODULE(s)
{
    boost::python::def("get_string_function", get_string_function_pywrapper);
}

现在,Python 这边可以像我们想的那样使用这个结果:

>>> import s
>>> s.get_string_function("Coord")
<Boost.Python.function object at 0x1cca450>
>>> _(1, 4)
'Coord(x=1, y=4)'

撰写回答