У меня есть структура класса, похожая на приведенную ниже, где у меня есть два типа 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();
}
Задача ещё не решена.
Других решений пока нет …