Я пытаюсь выставить eigen3 в python с помощью Boost.Python.Функция Python как аргумент в C++
я не могу найти способ, чтобы разоблачить functionunaryExpr (const CustomUnaryOp &func=CustomUnaryOp())
То, что я хотел бы иметь что-то, что позволит мне что-то вроде этого:
питона
import libMatrix as mat
a = mat.Matrix(10, 10)
mat.unary_expr(lambda x : 1)
У вас есть какие-либо идея ?? Это может выглядеть так:
void unary_expr(Matrix const& self, PyObject* callable_object)
{
cpp_callable = ??(callable_object)
self.unaryEpxr(cpp_callable);
}
=== То, что я пробовал: ============================== ============
1) Я пытался использовать простое определение CallBack
typedef double(*UnaryExprType)(double);
void unary_expr(Matrix const& self, UnaryExprType a);
{
self.unaryEpxr(a);
}
но бустер не преобразует функцию питона в UnaryExprType.
2) Я пытался использовать implement a structPythonCallBack
. Тем не менее, это не сработало, у меня есть ошибка, что подпись python не соответствует сигнатуре C++.
struct PythonCallBackBase
{
public:
virtual ~PythonCallBackBase() {}
virtual double operator() (double const & x) { return 0; }
};
struct PythonCallBack : PythonCallBackBase, boost::python::wrapper<PythonCallBackBase>
{
public:
typedef boost::python::wrapper<PythonCallBackBase> wrap;
double default_op(double const & x)
{
return 0;
}
double operator() (double const & x)
{
if (boost::python::override f = wrap::get_override("__call__"))
return f(x);
return PythonCallBackBase::operator()(x);
}
};
void unary_expr(Matrix const& self, PythonCallBack a)
{
self.unaryEpxr(a);
}
Сообщение об ошибке
ArgumentError: Python argument types in
Matrix.unary_expr(Matrix, Boost.Python.class)
did not match C++ signature:
unary_expr(Eigen::Matrix<double, -1, -1, 0, -1, -1>, PythonCallBack)
unary_expr(Eigen::Matrix<double, -1, -1, 0, -1, -1>, double (*)(double))
кажется, что это невозможно. http://www.boost.org/doc/libs/1_52_0/libs/python/doc/v2/faq.html – Setepenre