如何编写以特征张量为参数的通用模板函数?

Posted

技术标签:

【中文标题】如何编写以特征张量为参数的通用模板函数?【英文标题】:How to write generic templated functions taking Eigen Tensor as parameters? 【发布时间】:2016-10-15 23:49:54 【问题描述】:

编写采用特征矩阵/数组的函数的最佳实践在here 中有很好的记录。但我对如何对 Eigen::Tensor 对象和表达式做同样的事情很感兴趣。

更具体地说,我想编写通用模板化函数,该函数将张量对象或表达式作为参数,同时对它们进行一些操作(包括调整大小/修改)。

我尝试使用 TensorBase 作为函数参数,例如:

template<class Derived, int AccessLevel>
void myRankAgnosticFunc(Eigen::TensorBase<Derived, AccessLevel >& tensor) 
  ...
  tensor.derived().resize(...); // Doesn't work since derived() is private
  ....

然而不同的是,Eigen::MatrixBase derived() 是受保护的,不能使用。

关于如何使用 Eigen::Tensor 对象编写通用模板函数有什么建议吗?

【问题讨论】:

【参考方案1】:

我不知道为什么derived()TensorBase 中受到保护。作为一种解决方法,您可以像这样自己投射到Derived&amp;

Derived& tensr = static_cast<Derived&>(tensor);
// ...
tensr.resize(...);

【讨论】:

【参考方案2】:

为什么不简单地将张量类型作为模板参数传递?

template<class MyTensor>
void myRankAgnosticFunc(MyTensor& tensor) 
  ...
  tensor.resize(...);
  ...

【讨论】:

我同意,在大多数情况下这已经足够了。当然,您会失去一点类型安全性。 (而且我还是不明白,为什么derived() 是受保护的)

以上是关于如何编写以特征张量为参数的通用模板函数?的主要内容,如果未能解决你的问题,请参考以下文章

c++模板详解

如何对可变参数模板函数的异构参数包进行通用计算?

采用 Eigen::Tensor 的函数 - 模板参数推导失败

模板函数模板

模板……基础知识笔记

模板函数作为模板参数