首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eigen3类的模板专门化

Eigen3类的模板专门化
EN

Stack Overflow用户
提问于 2018-10-26 14:20:54
回答 2查看 155关注 0票数 1

我正在尝试实现模板来处理Eigen3矩阵和数组。一般来说,我的实现似乎工作得很好,但我无法通过模板规范扩展我的实现,无法使用Eigen3类型或标准数字类型(例如int、float、.)。

这是我当前代码的缩短版本:

代码语言:javascript
复制
#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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-26 14:25:46

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

如果你想学的更多,也看看SFINAE的一般情况,这就是std::enable_if所做的。

票数 1
EN

Stack Overflow用户

发布于 2018-10-28 01:03:54

首先要感谢你的快速反应。

在周末,我确实看了一下您的建议,并最终找到了一个解决方案,它可以在VS2012和较新的gcc编译器版本(在线测试.)中编译。在上面的代码中,我将第二个模板更改为:

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

作为一个经验丰富的C++程序员,我不得不承认我对自己的困难感到惊讶(至少对我来说.)它是为了完成这样一项相对简单的任务。我想我还有很长的路要走.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53010768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档