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

Я хотел бы использовать библиотеку матриц Eigen в качестве механизма линейной алгебры в моей программе. Eigen использует шаблоны выражений для реализации ленивых вычислений и упрощения циклов и вычислений.

Например:

#include<Eigen/Core>

int main()
{
  int size = 40;
  // VectorXf is a vector of floats, with dynamic size.
  Eigen::VectorXf u(size), v(size), w(size), z(size);
  u = 2*v + w + 0.2*z;
}

Поскольку Eigen использует шаблоны выражений, код типа

u = 2*v + w + 0.2*z;

В приведенном выше примере сводится к одному циклу длиной 10 (не 40, числа с плавающей запятой помещаются в регистр порциями по 4) без создания временный. Как это круто?

Но если я интегрирую библиотеку следующим образом:

class UsingEigen
{
    public:  
        UsingEigen(const Eigen::VectorXf& data):
            data_(data)
        {}

        UsingEigen operator + (const UsingEigen& adee)const
        {
            return UsingEigen(data_ + adee.data_);
        }

        ...
    private:
        Eigen::VectorXf data_;
}

Тогда такие выражения, как:

UsingEigen a, b, c, d;
a = b + c + d;

не могут использовать преимущества способа реализации Eigen. И это не последний из них. Есть много других примеров использования шаблонов выражений в Eigen.

Простым решением было бы не определять операторы самостоятельно, сделать data_общедоступными и просто написать выражения вроде:

UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;

Это нарушает инкапсуляцию, но сохраняет эффективность Eigen.

Другим способом может быть создание собственных операторов, но пусть они возвращают шаблоны выражений. Но так как я новичок в С++, я не знаю, правильный ли это путь.

Извините, если вопрос носит слишком общий характер. Я новичок и спросить не у кого. До сих пор я везде использовал std::vector, но теперь мне нужно использовать и матрицы.Переход с std::vectorна Eigen во всем моем проекте — большой шаг, и я боюсь сделать неправильный вызов в самом начале. Любые советы приветствуются!

17
задан TemplateRex 11 June 2012 в 08:52
поделиться