Member 13737179 Ответов: 1

Шаблон матричного выражения C++


Привет, я новичок в программировании шаблонов выражений, я прошел через это этот руководство. Это довольно хорошо, что я немного понимаю вещи, но не могу реплицировать код на рабочий. Может кто-нибудь помочь ?
То, что я сделал -> От [листинг 3] Я сохранил его как файл matrix.h, но не знаю, как я могу создать новый объект matrix(точнее, я не знаю, что будут последние два параметра)
Спасибо.

Что я уже пробовал:

Файл Matrix.h-это форма здесь а внутри main.cpp я не умею создавать матрицу. Пожалуйста, какие - нибудь указания ?

1 Ответов

Рейтинг:
11

Rick York

Правые и левые параметры будут иметь тип LeftOp и RightOp, а те-тип Matrix. Вы можете убедиться в этом, посмотрев на код шаблона в списке. Вот два фрагмента :

template< typename T, size_t n, size_t m, typename LeftOp, typename RightOp>
class EtMatrixAdd
{
public:
  EtMatrixAdd(const LeftOp& lhs, const RightOp& rhs) : 
       m_lhs(lhs), m_rhs(rhs) {}
 
  T ElementAt(size_t n, size_t m) const
  {
     return m_lhs.ElementAt(n, m) + m_rhs.ElementAt(n, m);
  }
 
private:
  const LeftOp& m_lhs;
  const RightOp& m_rhs;
};
и
// Replaces operator+ of Listing 2
template<typename T, size_t n, size_t m>
inline EtMatrixAdd<T, n, m, Matrix<T, n, m>, Matrix<T, n, m> >
operator + ( const Matrix<T, n, m>& lhs, const Matrix<T, n, m>& rhs )
{
   return EtMatrixAdd<T, n, m, Matrix<T, n, m>, Matrix<T, n, m>>( lhs, rhs );
}
Как вы можете видеть во втором фрагменте, оба они относятся к типу :
Matrix<T, n, m>;
Где T-Тип данных, хранящихся в матрице, а n и m-индексы элементов матрицы, которые будут добавлены. Примеры объявления матрицы приведены на первой странице статьи.


Member 13737179

так что даже если я сделаю Matrix<int, 2, 2 >a; Matrix<int, 2, 2 >b; ETMatrixAdd<int 2, 2, a, b>s; это не сработает , некоторые ошибки компиляции тоже. Я добавляю код как листинга-3, так и листинга-1 в один и тот же файл matrix.h. [здесь](https://ideone.com/XBpkbn)

Rick York

Сейчас я больше ничем не могу помочь, но постараюсь позже, когда вернусь домой. :)

Member 13737179

в любом случае спасибо :)

Rick York

После небольшого поиска в google я нашел эту страницу : http://jeremyko.blogspot.com/2009/08/expression-template.html

Запустите это через переводчик google (Если вам нужно), и вы увидите целую статью. Надеюсь, это поможет.

Member 13737179

Привет, Рик, спасибо за эту ссылку. Постараюсь расширить код для поддержки`*`, `+=`, `*=`

Member 13737179

Я могу сделать для S = A * A; но делая S = A * A * A; бросая ошибку,я реализовал аналогично сложению только разницу, где я просто получаю сумму индексов в i, j для 2 матриц я получаю целую i-ю строку и j-й столбец..а затем умножаю,складываю и возвращаю...но это имеет смысл, почему эта ошибка приходит.. есть какие-нибудь идеи для лучшей реализации ?
Большое спасибо за помощь! :)