Собственные пользовательские классы и параметры функции - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь заменить матричную библиотеку, используемую в настоящее время в моем коде, используя Eigen.У меня есть несколько классов, таких как этот, добавляющих пользовательские методы в базовый класс матрицы.В этом примере я заменил класс отца на Eigen:

#include <iostream>
#include <eigen3/Eigen/Dense>

class MyVectorType: public Eigen::Matrix<double, 3, 1> {
public:
    MyVectorType(void) :
            Eigen::Matrix<double, 3, 1>() {
    }
    typedef Eigen::Matrix<double, 3, 1> Base;
    // This constructor allows you to construct MyVectorType from Eigen expressions
    template<typename OtherDerived>
    MyVectorType(const Eigen::MatrixBase<OtherDerived>& other) :
            Eigen::Matrix<double, 3, 1>(other) {
    }
    // This method allows you to assign Eigen expressions to MyVectorType
    template<typename OtherDerived>
    MyVectorType & operator=(const Eigen::MatrixBase<OtherDerived>& other) {
        this->Base::operator=(other);
        return *this;
    }
    void customMethod() {
        //bla bla....
    }
};

Большая проблема заключается в том, что не так просто управлять пользовательскими классами в методах.Пример:

void foo(MyVectorType& a) {
    ....
    a.customMethod();
}

void foo(Eigen::Ref<MyVectorType::Base> a) {
    ....
    a.customMethod(); <---can't call customMethod here
}

Eigen::Matrix<double, -1, -1, 0, 15, 15> m(3,1);
foo(m); <---can't call it with m;
Eigen::Map<Matrix<double, 3, 1> > map(m.data(), 3, 1);
Eigen::Ref<Matrix<double, 3, 1> > ref(map);
foo(ref); <---it works but I can't call custom method

Обычно Eigen предоставляет класс шаблона Ref, но я не могу использовать его с пользовательскими классами, потому что если я использую Ref, я не смогу вызывать customMethod внутри foo в этом примере, я должен Eigen:Ссылка в моем примере.Отказ от использования Ref - большая проблема, потому что использование объектов Map и Ref Eigen весьма важно для приведения динамической матрицы к фиксированной и выполнения других операций приведения.Последний вопрос: какова лучшая стратегия использования Eigen в этом случае?

1 Ответ

0 голосов
/ 04 февраля 2019

Существует как минимум три подхода:

  1. Избавьтесь от MyVectorType и сделайте customMethod членом MatrixBase с помощью механизма plugin .

  2. Избавьтесь от MyVectorType и сделайте customMethod бесплатной функцией.

  3. Специализируйте Eigen::Ref<MyVectorType>, позволяя ему наследовать Ref<MyVectorType::Base>и его конструктор, добавьте метод customMethod и разложите эти два метода, вызвав внутреннюю свободную функцию customMethod_impl.

...