Обернуть производный шаблон класса с Boost :: python

У меня есть производный класс от шаблона шаблона:

template<typename X, typename Y>
class BaseFunction
{
static void export_BaseFunction()
{
?????
};
};
class Function : public BaseFunction<pair<double, double>, double>
{
Function() : BaseFunction<pair<double, double>, double>() {};
static void export_Function()
{
BaseFunction::export_BaseFunction();
boost::python::class_<Function, boost::python::bases<BaseFunction<pair<double, double>, double>>, boost::shared_ptr<Function>>("Function");

}
};

Так Boost :: Python просит меня создать оболочку класса для BaseFunction, но я не нахожу никакой информации для написания шаблона класса, только функция шаблона …
Должен ли я определить оболочку класса для каждого базового класса?
Должен ли я определить оболочку класса для каждого типа, используемого в моем шаблонном классе?

Спасибо за ваши полезные ответы

1

Решение

RuntimeError происходит потому, что требование для class_«s Bases Параметр шаблона не выполняется:

Специализация bases<...> который определяет ранее выставленные C ++ базовые классы T

С ранее выставленным существом объяснил как:

namespace python = boost::python;
python::class_<Base>("Base");
python::class_<Derived, python::bases<Base> >("Derived");

Чтобы решить RuntimeError, или:

  • Опустить bases информация, если подвергающемуся API не требуется выполнять обновление или передачу с Function а также BaseFunction<...>, Например, если ни одна из функций C ++, доступных для Python, не имеет тип параметра BaseFunction<...> или вернуть Function объект как BaseFunction<...>&, то Boost.Python не нужно знать о типе отношений.
  • В противном случае базовый класс должен быть выставлен и Function Нужно разоблачить отношения:

    namespace python = boost::python;
    typedef BaseFunction<pair<double, double>, double> function_base_type;
    python::class_<function_base_type>("Base");
    python::class_<Function, python::bases<function_base_type> >("Function");
    

    При регистрации экземпляра определенного типа BaseFunction, строковый идентификатор должен быть уникальным.


Ниже приведен полный пример, который имеет Function разоблачать BaseFunction, export_BaseFunction() Функция проверит, была ли она уже зарегистрирована, чтобы предотвратить предупреждение о дублированных конверсиях, и будет использовать информационное имя типа C ++ для устранения неоднозначности между различными экземплярами шаблона BaseFunction,

#include <utility>  // std::pair
#include <typeinfo> // typeid
#include <boost/python.hpp>

template<typename X, typename Y>
class BaseFunction
{
public:
static void export_BaseFunction()
{
// If type is already registered, then return early.
namespace python = boost::python;
bool is_registered = (0 != python::converter::registry::query(
python::type_id<BaseFunction>())->to_python_target_type());
if (is_registered) return;

// Otherwise, register the type as an internal type.
std::string type_name = std::string("_") + typeid(BaseFunction).name();
python::class_<BaseFunction>(type_name.c_str(), python::no_init);
};
};

class Function
: public BaseFunction<std::pair<double, double>, double>
{
private:

typedef BaseFunction<std::pair<double, double>, double> parent_type;

public:

static void export_Function()
{
// Explicitly register parent.
parent_type::export_BaseFunction();
// Expose this type and its relationship with parent.
boost::python::class_<Function, boost::python::bases<parent_type>,
boost::shared_ptr<Function> >("Function");
}
};

/// @brief Example function to demonstrate upcasting.
void spam(BaseFunction<std::pair<double, double>, double>&) {}

BOOST_PYTHON_MODULE(example)
{
Function::export_Function();
boost::python::def("spam", &spam);
}

Интерактивное использование:

>>> import example
>>> f = example.Function()
>>> f
<example.Function object at 0xb7ec5464>
>>> example.spam(f)
2

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

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

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