我正在尝试实现与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
答案 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 ++程序员,我不得不承认我很惊讶实现这样一个相对简单的任务有多困难(至少对我来说……)。猜猜我还有很长的路要走...:-)