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

#c #templates #eigen #eigen3

#c #шаблоны #eigen #eigen3

Вопрос:

Рекомендации по написанию функций, использующих собственные матрицы / массивы, очень хорошо документированы здесь. Но меня интересует, как сделать то же самое для собственных ::тензорных объектов и выражений.

Более конкретно, я хочу написать общие шаблонные функции, которые принимают тензорные объекты или выражения в качестве параметров при выполнении над ними некоторых операций (включая изменение размера / модификацию).

Я попытался использовать TensorBase<> в качестве параметра функции, например:

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

Однако, в отличие от, Eigen::MatrixBase derived() защищен и не может быть использован.

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

Ответ №1:

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

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

Ответ №2:

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

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

}

Комментарии:

1. Я согласен, в большинстве случаев этого достаточно. Конечно, вы теряете немного безопасности типов. (И я до сих пор не понимаю, почему derived() защищен)