Как обернуть шаблонные классы с pybind11

У меня есть структура класса, похожая на приведенную ниже, где у меня есть два типа A и B с похожими сигнатурами, которые отличаются только типом аргумента / возвращаемого значения. Затем я использую шаблон класса, чтобы иметь возможность обрабатывать оба класса, получая статический вариант утилизации в Python. Теперь я хочу обернуть этот код в Python с помощью pybind11, где я надеюсь получить класс, который принимает оба типа, используя стандартное динамическое типирование. Как мне это сделать?

Я в основном ищу способ отключить строгую проверку типов в 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();
}

5

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]