Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class MatrixA{
- //конкретная реализация типовых операций с матрицами,
- //со своими публичными членами для вызова
- //например сложение:
- MatrixA sum(const MatrixA& one, const MatrixB& two){...}
- };
- class MatrixB{
- //совершенно другая реализации матрицы
- //с совершенно другим интерфейсом
- MatrixB do_summation(...){...}
- };
- template<typename MatrixType>
- class MatrixAlgebra{
- virtual MatrixType matrix_add(const MatrixType& m1,
- const MatrixType& m2) const=0;
- };
- template<typename MatrixType, typename MatrixAlgebraType>
- class Traits{
- typedef MatrixType matrix_t;
- typedef MatrixAlgebraType matrix_algebra_t;
- };
- class AMatrixAlgebra:
- public MatrixAlgebra<MatrixA>{
- MatrixA matrix_add(const MatrixA& m1,
- const MatrixA& m2) const override{
- //реализация с учетом конкретных особенностей типа MatrixA
- }
- };
- typedef Traits<MatrixA,AMatrixAlgebra> ATraits;
- MatrixA mA;
- diagonalize<ATraits>(mA);
- //и точно так же
- MatrixB mB(...);//может быть совершенно другой конструктор
- diagonalize<BTraits>(mB);
- template<typename Traits>
- class AutoGenerator:
- public Traits::matrix_algebra_t{
- typedef typename Traits::matrix_t matrix_t;
- typedef typename Traits::matrix_algebra_t matrix_algebra_t;
- public:
- AutoGenerator(){}
- matrix_t some_action(const matrix_t& m1, const matrix_t& m2){
- //и к примеру где-то тут делается сложение
- matrix_algebra_t::matrix_add(m1,m2);
- }
- };
- template<typename Traits>
- class AutoGenerator:
- public Traits::matrix_algebra_t{
- typedef typename Traits::matrix_t matrix_t;
- typedef typename Traits::matrix_algebra_t matrix_algebra_t;
- public:
- AutoGenerator(){}
- friend matrix_t operator+(const matrix_t& m1, const matrix_t& m2){
- //и к примеру где-то тут делается сложение
- return matrix_algebra_t::matrix_add(m1,m2);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement