Как написать общие шаблонные функции, принимающие собственный тензор в качестве параметров?

Рекомендации по написанию функций, использующих матрицы / массивы Эйгена, очень хорошо документированы здесь. Но меня интересует, как сделать то же самое для 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 производная () защищена и не может использоваться.

Есть предложения, как писать общие шаблонные функции с объектами Eigen :: Tensor?


person iNFINITEi    schedule 15.10.2016    source источник


Ответы (2)


Понятия не имею, почему derived() защищен в TensorBase. В качестве обходного пути вы можете использовать Derived& самостоятельно следующим образом:

Derived& tensr = static_cast<Derived&>(tensor);
// ...
tensr.resize(...);
person chtz    schedule 16.10.2016

Почему бы вам просто не передать тип тензора в качестве аргумента шаблона?

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

}

person Benoit Steiner    schedule 25.10.2016
comment
Согласен, в большинстве случаев этого достаточно. Конечно, вы теряете немного безопасности типов. (И я до сих пор не понимаю, почему derived() защищен) - person chtz; 26.10.2016