我有一个类似于下面的类结构,其中我有两种类型 A 和 B 具有相似的签名,只是参数/返回类型不同。然后我使用一个类模板来处理这两个类,在 Python 中实现了鸭式的静态变体。现在我想用 pybind11 将这段代码包装到 Python 中,我希望在其中得到一个使用标准动态鸭子类型的类。我该怎么做呢?
我基本上是在寻找一种方法来禁用 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();
}