Я пытался читать документацию Boost, но я не понимаю эту концепцию выражения. Класс Matrix наследует класс matrix_expression, я не понимаю, для чего этот класс используется.
Благодарю вас.
Это механизм для сдерживания какого-либо поведения.
matrix_container
это — как говорится в слове — контейнер.
matrix_expression
является выражением (например, сложение двух матриц).
Это основано на идиоме RCTI и помогает дизайну библиотеки.
Например, предположим, что вы хотите написать присвоение объекту класса (функции-члену). Предположим, что более простой контекст, чем Ublas, где у вас есть только матричный тип, и вы хотите написать:
template <typename _E>
void assign( _E const & e );
Проблема в том, что тогда вы можете назначить сокет или std :: string для матрицы. Как правило, этого пытаются избежать 😉
Итак, лучший способ написать:
template <typename _E>
void assign( matrix_expression<_E> const & e ) ;
Теперь вы можете назначать только матричные выражения.
Я подчеркиваю, что это только логика, а не конкретный дизайн убласа — однако логика всегда такая.
Скажем, теперь вы хотите написать свой собственный оператор * = с двумя матрицами, или с матрицей и выражением, или с двумя выражениями, и, возможно, для * = матрицы вы хотите использовать lapack.
Различие между matrix_expression
а также matrix_container
поможет вам написать специализированные версии этой операции.
PS: я подчеркиваю, это основополагающая логика / мотивация, а не то, что на самом деле происходит. Если вы когда-нибудь углубитесь в внутренности убласа, вы увидите больше того, как используется та же логика.
Других решений пока нет …