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++ 程序员,我不得不承认,我对完成这样一个相对简单的任务的难度(至少对我而言……)感到惊讶。我想我还有很长的路要走... :-)
我正在尝试实现模板以使用 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++ 程序员,我不得不承认,我对完成这样一个相对简单的任务的难度(至少对我而言……)感到惊讶。我想我还有很长的路要走... :-)