#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()
защищен)