Eigen3类的模板专业化

时间:2018-10-26 14:20:55

标签: c++ templates eigen3

我正在尝试实现与Eigen3矩阵和数组一起使用的模板。通常,我的实现似乎工作得很好,但是我无法通过模板特殊化扩展我的实现,从而无法使用Eigen3类型或标准数值类型(例如int,float等)。

这是我当前代码的简化版本:

#include <Eigen/Dense>
using namespace Eigen;

template<typename T>
void myFunc(Eigen::MatrixBase<T>& matrix)
{
  cout << "Eigen type" << endl;
}
template<typename T>
void myFunc(T& matrix)
{
  cout << "numeric type" << endl;
}

void main (void)
{
  int var=9;
  Eigen::Matrix<double,1,1> mat;

  myFunc(mat);  // This should uset the first template, but it doesn't !
  myFunc(var);
}

这可以很好地编译,但是当我运行它时,对myFunc的两个调用都将定向到第二个模板(->“数字类型”),这当然不是我想要实现的。

任何解决此问题的提示将不胜感激。

塞巴斯蒂安

PS:使用MSVC 2012

2 个答案:

答案 0 :(得分:1)

之所以选择第二个函数,是因为将Eigen::Matrix<double,1,1>实例化为T时,它比第一个函数更好。您需要限制第二个函数,因此它仅对您想要的类型有效。看看std::enable_if,该页面上的示例几乎完全符合您的要求。

如果您想了解更多信息,那么通常也请参阅 SFINAE ,这就是std::enable_if的作用。

答案 1 :(得分:0)

首先感谢您的快速反应。

整个周末,我确实查看了您的建议,最后得出了一个解决方案,该解决方案可以在VS2012以及较新的gcc编译器版本中进行编译(已在线测试...)。在上面的代码中,我将第二个模板更改为以下模板:

template<typename T,
          typename std::enable_if<std::is_arithmetic<Derived>::value >::type* dummy = 0>
void myFunc(T& var)
{
  cout << "numeric type" << endl;
}

我不是一个经验丰富的C ++程序员,我不得不承认我很惊讶实现这样一个相对简单的任务有多困难(至少对我来说……)。猜猜我还有很长的路要走...:-)