带有特征参数的模板推导

时间:2018-03-29 17:13:43

标签: c++ templates eigen

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>’并且模板参数推断失败。

为什么会发生这种情况,我们应该如何应对呢?

由于

3 个答案:

答案 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)没有虚拟析构函数。因此我的解决方案不合适。唯一的方法

  1. 使用std::transform()std::vector<Eigen::MatrixBase<Derived>*>获取std::vector<std::unique_ptr<Eigen::MatrixBase<Derived>>>
  2. @xskxzr提供的解决方案

答案 2 :(得分:1)

我没有注意到接受vector Eigen::MatrixBaseMatrix个对象。 我不知道您的用例,但通常只有将vector对象存储在template<class S, int rows, int cols> void func(std::vector<Eigen::Matrix<S, rows, cols> > const &) { } 内才有意义。将其传递给模板函数很容易:

vector

Usage example

注意:您可以为具有默认值的模板参数添加更多模板参数,例如MatrixOptions或S的分配器。同样,您可以省略模板参数,例如double始终为{{1}}。