在模板函数中将 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
获取表达式的标量类型。
这是我想写的函数:
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
获取表达式的标量类型。