我正在编写一个使用 Eigen 数据类型的通用类。我已经在将构造函数参数分配给类成员变量时遇到了问题。我的代码的简化版本是:
template <typename Derived>
class A
{
public:
Eigen::Matrix<Derived> M; // error C2976: too few template parameters
A(const Eigen::DenseBase<Derived> & V)
{
M = V.eval(); // I would want to snapshot the value of V.
}
};
我现在的问题是
M
应该是什么数据类型?我尝试了多种选择,例如:Eigen::internal::plain_matrix_type_column_major<Derived> M;
Eigen::DenseBase<Derived> M;
但它们只是产生不同的错误。
请注意,我使用 C++17 并期望从构造函数推断出类模板参数。
最佳答案
您的容器需要实际的“普通类型”作为模板参数:
template <typename PlainType>
class A
{
PlainType M;
public:
template<class Derived>
A(const Eigen::MatrixBase<Derived> & V) : M(V) {}
};
你需要一个额外的模板推导规则:
template<class Derived>
A(const Eigen::MatrixBase<Derived> & V) -> A<typename Derived::PlainObject>;
用法示例( on godbolt ):
template<class X>
void bar(X&); // just to read full type of A
void foo(Eigen::Matrix2d const& M)
{
A a = M*M;
bar(a); // calls bar<A<Matrix2d>>();
}