gpt4 book ai didi

python - 如何使用 pybind11 包装模板类

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:07 26 4
gpt4 key购买 nike

我有一个类似于下面的类结构,其中我有两个类型 A 和 B,它们具有相似的签名,只是参数/返回类型不同。然后我使用一个类模板来处理这两个类,在 Python 中实现 ducktyping 的静态变体。现在我想使用 pybind11 将此代码包装到 Python 中,我希望在其中使用标准的动态 ducktyping 获得一个采用两种类型的类。我该怎么做?

我基本上是在寻找一种方法来禁用 pybind11 中的严格类型检查或指定多种类型以便同时接受 TypeA 和 TypeB。下面示例的定义方式,只有 TypeA 通过检查。由于函数签名不同,我也无法将 A 和 B 统一为一个基类。

#include <pybind11/pybind11.h>
#include <iostream>

class TypeA {
public:
typedef double InType;
typedef std::string OutType;
const OutType operator()(const InType arg)
{
return std::to_string(arg);
}
};

class TypeB {
public:
typedef std::string InType;
typedef double OutType;
const OutType operator()(const InType arg)
{
return std::stod(arg);
}
};

template<typename T>
class DuckType {
public:
void runType(const typename T::InType arg)
{
T x;
const typename T::OutType y = x(arg);
std::cout << y << std::endl;
}
};

namespace py = pybind11;

PYBIND11_PLUGIN(ducktyping) {

pybind11::module m("ducktyping", "Testing ducktyping with templates");

typedef DuckType<TypeA> Type;
py::class_<Type>(m, "DuckType")
.def("run_type", &Type::runType);
;
return m.ptr();
}

最佳答案

如果您要绑定(bind)的函数具有可以在 C++ 中“驱动”推理的参数,您可以潜在地使用它们来驱动 pybind11 中的重载解析: https://pybind11.readthedocs.io/en/stable/advanced/functions.html#overload-resolution-order

例如,您可以将实例化绑定(bind)为重载,然后让 pybind11 自行解决:

// Let's say `DuckType::runType` is static.
m.def("runType", &DuckType<TypeA>::runType, py::arg("arg"));
m.def("runType", &DuckType<TypeB>::runType, py::arg("arg"));

然后分派(dispatch)将在 Python 中工作,假设用户可以实例化这些类型,并且 InType 被定义为它们不会意外拦截另一个类的类型:

runType(arg=1.2)  # TypeA
runType(arg="hello world") # TypeB

关于python - 如何使用 pybind11 包装模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44925081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com