fork(3) download
  1. #include <iostream>
  2. #include <sstream>
  3. using namespace std;
  4.  
  5. template <int N> struct Array : Array <N - 1>
  6. {
  7. double x;
  8.  
  9. template<int M> double& comp() { return Array<M>::x; }
  10. template<int M> const double& comp() const { return Array<M>::x; }
  11.  
  12. //Prints vector
  13. ostream& print(ostream& out) const
  14. {
  15. static_cast<const Array<N-1>*>(this)->print(out);
  16. out << ", " <<x;
  17. return out;
  18. }
  19.  
  20. double& operator[] (size_t i) {
  21. if (i == N - 1) {
  22. return x;
  23. }
  24. return Array<N - 1>::operator[](i);
  25. }
  26.  
  27.  
  28. //Vector in place summation, without looping
  29. Array& operator+=(const Array& v)
  30. {
  31. x+=v.x;
  32. *static_cast<Array<N-1>*>(this) += static_cast<const Array<N-1>&>(v);
  33. return *this;
  34. }
  35. };
  36.  
  37. template <> struct Array<1>
  38. {
  39. double x;
  40.  
  41. template<int M> double& comp() { return Array<M>::x; }
  42. template<int M> const double& comp() const { return Array<M>::x; }
  43.  
  44. //Prints vector
  45. ostream& print(ostream& out) const
  46. {
  47. out << x;
  48. return out;
  49. }
  50.  
  51. double& operator[](size_t i) {
  52. if (i != 0) { // If you don't care about strange behavior, you can remove this.
  53. throw std::out_of_range("Oops!");
  54. }
  55. return x;
  56. }
  57.  
  58. //Vector in place summation, without looping
  59. Array& operator+=(const Array& v)
  60. {
  61. x+=v.x;
  62. return *this;
  63. }
  64. };
  65.  
  66. template<int N>
  67. ostream& operator<<(ostream& out, const Array<N>& v)
  68. {
  69. out << "("; v.print(out); out << ")";
  70. return out;
  71. }
  72.  
  73. int main() {
  74. Array<3> vec;
  75.  
  76. vec[0] = 1; vec[1] = 2; vec[2] = 3;
  77.  
  78. cout << vec << endl;
  79.  
  80. cout << (vec+=vec) << endl;
  81.  
  82. return 0;
  83. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
(1, 2, 3)
(2, 4, 6)