Advertisement
Guest User

Untitled

a guest
Oct 8th, 2015
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. class MatrixA{
  2. //конкретная реализация типовых операций с матрицами,
  3. //со своими публичными членами для вызова
  4. //например сложение:
  5. MatrixA sum(const MatrixA& one, const MatrixB& two){...}
  6. };
  7.  
  8. class MatrixB{
  9. //совершенно другая реализации матрицы
  10. //с совершенно другим интерфейсом
  11. MatrixB do_summation(...){...}
  12. };
  13.  
  14. template<typename MatrixType>
  15. class MatrixAlgebra{
  16. virtual MatrixType matrix_add(const MatrixType& m1,
  17. const MatrixType& m2) const=0;
  18. };
  19.  
  20. template<typename MatrixType, typename MatrixAlgebraType>
  21. class Traits{
  22. typedef MatrixType matrix_t;
  23. typedef MatrixAlgebraType matrix_algebra_t;
  24. };
  25.  
  26. class AMatrixAlgebra:
  27. public MatrixAlgebra<MatrixA>{
  28. MatrixA matrix_add(const MatrixA& m1,
  29. const MatrixA& m2) const override{
  30. //реализация с учетом конкретных особенностей типа MatrixA
  31. }
  32. };
  33.  
  34. typedef Traits<MatrixA,AMatrixAlgebra> ATraits;
  35.  
  36. MatrixA mA;
  37. diagonalize<ATraits>(mA);
  38.  
  39. //и точно так же
  40. MatrixB mB(...);//может быть совершенно другой конструктор
  41. diagonalize<BTraits>(mB);
  42.  
  43. template<typename Traits>
  44. class AutoGenerator:
  45. public Traits::matrix_algebra_t{
  46. typedef typename Traits::matrix_t matrix_t;
  47. typedef typename Traits::matrix_algebra_t matrix_algebra_t;
  48. public:
  49. AutoGenerator(){}
  50. matrix_t some_action(const matrix_t& m1, const matrix_t& m2){
  51. //и к примеру где-то тут делается сложение
  52. matrix_algebra_t::matrix_add(m1,m2);
  53. }
  54. };
  55.  
  56. template<typename Traits>
  57. class AutoGenerator:
  58. public Traits::matrix_algebra_t{
  59. typedef typename Traits::matrix_t matrix_t;
  60. typedef typename Traits::matrix_algebra_t matrix_algebra_t;
  61. public:
  62. AutoGenerator(){}
  63. friend matrix_t operator+(const matrix_t& m1, const matrix_t& m2){
  64. //и к примеру где-то тут делается сложение
  65. return matrix_algebra_t::matrix_add(m1,m2);
  66. }
  67. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement