template <typename Derived>
void Fun(const std::vector<Eigen::MatrixBase<Derived>> &seqs);
void Test() {
std::vector<Eigen::MatrixXd> _seqs;
Fun(_seqs);
}
由functions taking eigen types辅导,Eigen::MatrixBase<Derived>
应接受Eigen::MatrixXd
。但是,上面的代码无法使用错误消息编译mismatched types ‘Eigen::MatrixBase<Derived>’ and ‘Eigen::Matrix<double, -1, -1>’
并且模板参数推断失败。
为什么会发生这种情况,我们应该如何应对呢?
由于
答案 0 :(得分:3)
这是因为template-name<T>
D
作为一个整体参数(忽略参考和cv限定符)可以从D
推断template-name<T>
} T
来自某些std::vector<template-name<T>>
。此规则不适用于std::vector<Derived>
。
即使您明确指定了类型,由于没有从std::vector<Base>
到template <
typename T,
// enable only if T is derived from Eigen::MatrixBase<T>
typename std::enable_if_t<std::is_base_of<Eigen::MatrixBase<T>, T>::value, int> = 0
>
void Fun(const std::vector<T>&);
的有效转换,调用仍然是格式错误。
除了S.M。的解决方案,您还可以使用元编程。
Programs
答案 1 :(得分:1)
您应该声明函数和变量,如下所示
template <typename Derived>
void Fun(const std::vector<std::unique_ptr<Eigen::MatrixBase<Derived>>> &seqs);
std::vector<std::unique_ptr<Eigen::MatrixBase<Derived>>> _seqs;
用向Eigen::MatrixXd
的指针填充向量:
_seq.emplace_back(new Eigen::MatrixXd);
更新 @chtz告诉我Eigen::MatrixBase
(继承struct EigenBase
)没有虚拟析构函数。因此我的解决方案不合适。唯一的方法
std::transform()
从std::vector<Eigen::MatrixBase<Derived>*>
获取std::vector<std::unique_ptr<Eigen::MatrixBase<Derived>>>
。答案 2 :(得分:1)
我没有注意到接受vector
Eigen::MatrixBase
个Matrix
个对象。
我不知道您的用例,但通常只有将vector
对象存储在template<class S, int rows, int cols>
void func(std::vector<Eigen::Matrix<S, rows, cols> > const &) { }
内才有意义。将其传递给模板函数很容易:
vector
注意:您可以为具有默认值的模板参数添加更多模板参数,例如MatrixOptions或S
的分配器。同样,您可以省略模板参数,例如double
始终为{{1}}。