Eigen3 的模板专业化 类

Template specialization for Eigen3 classes

我正在尝试实现模板以使用 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 的两次调用都将定向到第二个模板 (-> "numeric type"),这当然不是我想要实现的。

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

塞巴斯蒂安

PS:使用 MSVC 2012

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

如果您想了解更多信息,请总体上查看 SFINAE,这就是 std::enable_if 所做的。

首先感谢您的快速反应。

周末我确实查看了您的建议并最终得出了一个解决方案,该解决方案可以在 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++ 程序员,我不得不承认,我对完成这样一个相对简单的任务的难度(至少对我而言……)感到惊讶。我想我还有很长的路要走... :-)