Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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
C++ 包裹C++;Python绑定的表达式模板_C++_Python 3.x_C++17_Pybind11 - Fatal编程技术网

C++ 包裹C++;Python绑定的表达式模板

C++ 包裹C++;Python绑定的表达式模板,c++,python-3.x,c++17,pybind11,C++,Python 3.x,C++17,Pybind11,假设我们在C++中有一个非常简单的表达式模板实现 /*MyHeader.hpp*/ #布拉格语一次 #包括 模板 结构向量 { const-VT&operator~()const{return static_cast(*this);} }; 模板 struct MyVector:公共向量 { MyVector(ta,tb,tc){data={a,b,c};} 常量T&运算符[](size_T i)常量{返回数据[i];} std::数组数据; }; 模板 结构二进制表达式:公共向量 { 二进制表

假设我们在
C++
中有一个非常简单的
表达式模板
实现

/*MyHeader.hpp*/
#布拉格语一次
#包括
模板
结构向量
{
const-VT&operator~()const{return static_cast(*this);}
};
模板
struct MyVector:公共向量
{
MyVector(ta,tb,tc){data={a,b,c};}
常量T&运算符[](size_T i)常量{返回数据[i];}
std::数组数据;
};
模板
结构二进制表达式:公共向量
{
二进制表达式(常量LHS和LHS,常量RHS和RHS,OP)
:lhs(lhs),rhs(rhs),op(op){
自动运算符[](size_t i)常量{return op(lhs[i],rhs[i]);}
恒左&恒左;恒右&恒右;恒OP;
};
模板
decltype(自动)运算符+(常量向量和lhs、常量向量和rhs)
{
返回二进制表达式(~lhs,~rhs,[](auto x,auto y){return x+y;});
}
模板
decltype(自动)运算符*(常量向量和lhs、常量向量和rhs)
{
返回二进制表达式(~lhs,~rhs,[](auto x,auto y){return x*y;});
}
与一些
Python
绑定一起,使用
pybind11

/*PyBindings.cpp*/
#包括
#包括
#包括“MyHeader.hpp”
名称空间py=pybind11;
PYBIND11_模块(ExprTemplTest,m){
使用VecType=MyVector;
py::class_m(MyVector)
.def(py::init())
.def(“uu getitem_uuu”,[](VecType&vec,const size\u t&idx){return vec[idx];})
.def(py::self+py::self)
.def(py::self*py::self);
}
现在的问题是(通过设计)所有表达式都需要在编译时知道。所以这个Python脚本失败了

1导入导出测试为ett
2v1=ett.MyVector(14,2,9)
3 v2=ett.MyVector(14,2,9)
---->4 v1+v2
#TypeError:无法将函数返回值转换为Python类型!签名是
#(self:ExprTemplTest.MyVector,arg0:ExprTemplTest.MyVector)
#->二进制表达式
也就是说,我们必须在
PyBindings.cpp
中定义
py::class_u
(这有点棘手,因为其中有lambda)。此外,对于任何其他表达式(如
v1+v2*v2
),我们必须定义另一个类,依此类推


是否可以以某种方式将
BinaryExpression
类型包装到Python可以处理的泛型类中?

如果您可以从Python调用BinaryExpression的泛型版本,或者可以使用对数据的泛型访问器在Python中构造泛型版本,然后,您可以向Python中的基类添加一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
函数,并调用该函数。我只是不知道如何在不复制Python中的二进制表达式代码的情况下做到这一点。另外,对于这样的情况,我通常会推荐cppyy(),但您的代码实际上发现了一个bug(谢谢),所以我先修复它。:)pyBin将一个C++类绑定到一个Python类。这意味着您需要先实例化所有模板类,然后再将其绑定到pybind。因此,需要在C++侧管理许多模板类的问题。将
OP
从模板参数移动到成员(
std::function
)可能是可以接受的,但(可能)是低效的解决方案。看看eigen库及其在pybind中的绑定,您可能会发现它很有用。