7

以下のようなクラス構造があります。ここでは、引数/戻り値の型のみが異なる同様のシグネチャを持つ 2 つの型 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();
}
4

2 に答える 2