Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编写以本征张量为参数的通用模板函数?_C++_Templates_Eigen_Eigen3 - Fatal编程技术网

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

C++ 如何编写以本征张量为参数的通用模板函数?,c++,templates,eigen,eigen3,C++,Templates,Eigen,Eigen3,使用特征矩阵/数组编写函数的最佳实践已经有很好的文档记录。但我感兴趣的是如何对对象和表达式执行相同的操作 更具体地说,我想编写通用模板函数,在对张量对象或表达式执行某些操作(包括调整大小/修改)时将其作为参数 我尝试使用TensorBase作为函数参数,例如: template<class Derived, int AccessLevel> void myRankAgnosticFunc(Eigen::TensorBase<Derived, AccessLevel >&a

使用特征矩阵/数组编写函数的最佳实践已经有很好的文档记录。但我感兴趣的是如何对对象和表达式执行相同的操作

更具体地说,我想编写通用模板函数,在对张量对象或表达式执行某些操作(包括调整大小/修改)时将其作为参数

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

template<class Derived, int AccessLevel>
void myRankAgnosticFunc(Eigen::TensorBase<Derived, AccessLevel >& tensor) {
  ...
  tensor.derived().resize(...); // Doesn't work since derived() is private
  ....
}
模板
void myRankAgnosticFunc(本征::张量基和张量){
...
tensor.derived().resize(…);//不起作用,因为derived()是私有的
....
}
但是,与之不同的是,Eigen::MatrixBase-Derivated()受保护,无法使用


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

我不知道为什么
derived()
TensorBase
中受到保护。作为一种解决方法,您可以像这样强制转换为
派生的&
您自己:

Derived& tensr = static_cast<Derived&>(tensor);
// ...
tensr.resize(...);
Derived&tensr=static_cast(张量);
// ...
调整张量(…);

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

template<class MyTensor>
void myRankAgnosticFunc(MyTensor& tensor) {
  ...
  tensor.resize(...);
  ...
模板
void myRankAgnosticFunc(MyTensor和tensor){
...
张量。调整大小(…);
...

}

我同意,在大多数情况下,这就足够了。当然,你会失去一点类型安全性。(我仍然不明白,为什么
derived()
受到保护)