Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python函数在C++;_Python_C++_C_Boost_Boost Python - Fatal编程技术网

Python函数在C++;

Python函数在C++;,python,c++,c,boost,boost-python,Python,C++,C,Boost,Boost Python,我正试图使用Boost.python在python中公开eigen3 我找不到方法公开unaryExpr(const CustomUnaryOp&func=CustomUnaryOp()) 我想要的是能让我拥有这样的东西: void unary_expr(Matrix const& self, PyObject* callable_object) { cpp_callable = ??(callable_object) self.unaryEpxr(cpp_callable)

我正试图使用Boost.python在python中公开eigen3

我找不到方法公开
unaryExpr(const CustomUnaryOp&func=CustomUnaryOp())

我想要的是能让我拥有这样的东西:

void unary_expr(Matrix const& self, PyObject* callable_object)
{
   cpp_callable = ??(callable_object)
   self.unaryEpxr(cpp_callable);
}
蟒蛇

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) 我尝试使用一个简单的回调定义

typedef double(*UnaryExprType)(double);
void unary_expr(Matrix const& self, UnaryExprType a);
    {
       self.unaryEpxr( a );
    }
但是boost并没有将python函数转换为一个unaryExprtType

2)我尝试过<代码> PythonCallBack <代码>,但是它不起作用,我有一个错误,即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 );
}
struct PythonCallBackBase
{
公众:
虚拟~PythonCallBackBase(){}
虚拟双运算符()(双常量&x){return 0;}
};
结构PythonCallBack:PythonCallBackBase,boost::python::wrapper
{
公众:
typedef boost::python::wrapper wrap;
双默认值(双常量和x)
{
返回0;
}
双运算符()(双常量和x)
{
if(boost::python::override f=wrap::get_override(“\u_调用\u”))
返回f(x);
返回PythonCallBackBase::operator()(x);
}
};
void一元表达式(矩阵常量和自我,蟒蛇背甲)
{
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))
ArgumentError:中的Python参数类型
一元表达式(矩阵,Boost.Python.class)
与C++签名不匹配:
一元表达式(特征::矩阵,PythonCallBack)
一元表达式(本征::矩阵,双(*)(双))

Boost.Python的设计目的是最大限度地减少与
PyObject
交互的需要,人们通常可以简单地使用
Boost::Python::object
,就像使用Python中的对象一样。例如,如果
func
是一个引用了
lambda x:1
,那么下面是带注释的Python注释的Boost.Python用法:

func=lambda x:1 boost::python::object func=。。。; //>>>结果=函数(42) boost::python::object result=func(42); //>>>断言(1==结果) 断言(1==boost::python::extract(result));

在此情况下,由于C++代码可能希望函子的返回值是C++类型而不是通用的代码> Boo::Python::对象< /C> >,可以使用包装类型来适应函子。< /P> 将Boost.Python对象适配到 ///具有显式返回类型的一元函子。 模板 类py_一元函子 { 公众: typedef Arg参数类型; typedef结果类型; py_一元函数(boost::python::object) :对象(对象) {} 结果类型运算符()(参数类型a1) { 返回boost::python::extract(object_u1;(a1))(); } 私人: boost::python::object\uuz; };


下面是一个完整的最小示例:

#包括
///@brief-Mockup-matrix类。
结构矩阵
{
模板
void unaryExpr(CustomUnaryOp func)
{
值=func(值);
}
双重价值;
};
///@brief辅助类型,用于将Boost.Python对象适配到
///具有显式返回类型的一元函子。
模板
类py_一元函子
{
公众:
typedef Arg参数类型;
typedef结果类型;
py_一元函数(boost::python::object)
:对象(对象)
{}
结果类型运算符()(参数类型a1)
{
返回boost::python::extract(object_u1;(a1))();
}
私人:
boost::python::object\uuz;
};
///@用于调整矩阵的简短辅助函数::unaryExpr。
空洞矩阵(
矩阵与自我,
boost::python::object(对象)
{
py_一元函数func(object);
返回self.unaryExpr(func);
}
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::class_389;(“矩阵”)
//公开辅助功能。
.def(“unaryExpr”&矩阵_unaryExpr)
.add_属性(“值”、&matrix::value、&matrix::value)
;
}
互动使用:

>>导入示例
>>>矩阵=示例。矩阵()
>>>矩阵值=21
>>>断言(21==矩阵值)
>>>矩阵.unaryExpr(λx:x*2)
>>>断言(42==矩阵值)
这似乎是不可能的。