在模板函数中将 Ref<> 用于通用特征矩阵

Using Ref<> for generic Eigen matrices in a templated function

这是我想写的函数:

template<typename NumType> using Vec = Eigen::Matrix<NumType, Eigen::Dynamic, 1>;


template<typename T>
void foo(Eigen::Ref<Vec<T>> p)
{
  // fill p with things
}

void main()
{
  Vec<double> v(2);
  foo(v)
}

特别是我希望能够在不将类型参数传递给模板的情况下调用 foo,而是让函数根据参数推断类型。当我 运行 这段代码时,我得到的错误是

No matching function call to 'foo'
Candidate template ignored: could not match 'Ref' against 'Matrix'

如果我将类型传递给函数调用,此函数可以正常工作,例如 foo<double>(v)。我也知道如果 foo 的签名是

就可以推断类型 T
template<typename T>
void foo(Vec<T> & p)

但这不是通过引用传递特征向量的好方法,因为它破坏了表达式模板的好处。

我也不能使用MatrixBase引用传递的方法

template<typename Derived>
void foo(Eigen::MatrixBase<Derived>& p)

因为我想确定传入的向量是 T 类型,但我不知道如何使用此方法确保这一点。

有没有办法在像这样的模板函数中使用 Ref<> 来推断类型 T?感谢所有帮助。

对于模板代码,使用 MatrixBase 方法,并控制标量类型,然后使用静态断言或 enable_if 构造。使用 typename Derived::Scalar 获取表达式的标量类型。