如何定义可接受Eigen表达式的通用MatrixBase函数参数?
问题原因分析
- 首先,函数输入参数为非常量左值引用
Eigen::MatrixBase<D>& in,而A*B属于临时生成的Eigen表达式右值,无法绑定到非常量左值引用,同时临时表达式本身带const属性,类型不匹配。 - 其次,两个入参共用同一个模板参数D推导,
A*B的实际类型为特化的Eigen::Product表达式类,第二个参数res的类型是Eigen::VectorXd对应的派生类,二者类型不一致导致模板参数推导冲突,无法匹配到对应的函数重载。
解决方案
不需要更换比Eigen::MatrixBase更通用的基类,只要调整模板参数和参数修饰符即可:
- 输入参数改为
const Eigen::MatrixBase<D>&,即可支持接收const属性的临时表达式 - 输入和输出参数分别使用独立的模板参数,避免推导冲突
修改后可正常运行的代码如下:
#include <iostream> #include "Eigen/Dense" // 输入输出用独立模板参数,输入加const修饰 template <typename DerivedIn, typename DerivedOut> void eval(const Eigen::MatrixBase<DerivedIn>& in, Eigen::MatrixBase<DerivedOut>& out) { out.array() = in.array() + 1; } int main() { Eigen::MatrixXd A(2,2); A(0,0) = 2; A(1,1) = 1; Eigen::VectorXd B(2); B(1) = 1; std::cout << A << ", " << B << std::endl; Eigen::VectorXd res(2); eval(A*B, res); std::cout << res << std::endl; }
扩展说明
如果需要支持写入表达式(比如左值表达式作为输出),当前的Eigen::MatrixBase<DerivedOut>&写法已经覆盖需求,Eigen官方的泛型函数编写规范就是采用这种写法,无需引入其他更通用的基类。
内容的提问来源于stack exchange,提问作者Jonas Hjulstad
相关产品推荐
相关产品推荐

