在模板化函数中使用 Ref<> 表示通用特征矩阵

jbc*_*li2 6 c++ templates eigen eigen3

这是我想写的一个函数:

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)
}
Run Code Online (Sandbox Code Playgroud)

特别是,我希望能够foo在不向模板传递类型参数的情况下进行调用,而是让函数通过参数推断类型。当我运行此代码时,我收到错误

No matching function call to 'foo'
Candidate template ignored: could not match 'Ref' against 'Matrix'
Run Code Online (Sandbox Code Playgroud)

如果我将类型传递给函数调用,例如foo<double>(v). T我也知道如果 的签名是 则可以推断foo出类型

template<typename T>
void foo(Vec<T> & p)
Run Code Online (Sandbox Code Playgroud)

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

我也无法使用MatrixBase引用传递的方法

template<typename Derived>
void foo(Eigen::MatrixBase<Derived>& p)
Run Code Online (Sandbox Code Playgroud)

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

有没有一种方法可以Ref<>在这样的模板化函数中使用它来推断类型T?感谢所有帮助。

gga*_*ael 2

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