fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <array>
  4. #include <vector>
  5. #include <type_traits>
  6. #include <typeinfo>
  7.  
  8. const size_t _sz = 3;
  9.  
  10. class ArrayHolder {
  11. int _arr[_sz];
  12. std::array<int, _sz> _arr2;
  13.  
  14. public:
  15. ArrayHolder(const int (&arr)[_sz], const std::array<int, 3>& arr2) : _arr2(arr2) {
  16. std::copy(std::begin(arr), std::end(arr), std::begin(_arr));
  17. }
  18.  
  19. template<size_t N1, size_t N2> ArrayHolder(const int (&arr)[N1], const std::array<int, N2>& arr2)
  20. : ArrayHolder(std::integral_constant<bool, (N1 <= _sz) && (N2 <= _sz)>{}, arr, arr2) { }
  21.  
  22. template<size_t N> ArrayHolder(bool b, const int (&arr)[N]) {
  23. std::copy(std::begin(arr), std::end(arr), std::begin(_arr));
  24. std::fill(&(_arr[N]), std::end(_arr), 99);
  25. _arr2.fill(121);
  26. }
  27.  
  28. private:
  29. template<size_t N1, size_t N2> ArrayHolder(std::true_type x, const int (&arr)[N1], const std::array<int, N2>& arr2) {
  30. std::copy(std::begin(arr), std::end(arr), std::begin(_arr));
  31. std::fill(&(_arr[N1]), std::end(_arr), 9);
  32.  
  33. std::copy(std::begin(arr2), std::end(arr2), std::begin(_arr2));
  34. std::fill(&(_arr2[N2]), std::end(_arr2), 9);
  35. }
  36.  
  37. public:
  38. void out() {
  39. for (int i = 0; i < 3; i++) {
  40. std::cout << _arr[i] << " " << _arr2[i] << std::endl;
  41. }
  42. }
  43.  
  44. const int (&getArr() const)[_sz];
  45.  
  46. typedef int _array_t[_sz];
  47. using _arr_t = decltype(_arr);
  48.  
  49. const _array_t& _getArr() const;
  50.  
  51. auto __getArr() const -> const int(&)[_sz];
  52.  
  53.  
  54. const std::array<int, _sz>& getArr2() { return _arr2; }
  55. };
  56.  
  57. const int (&ArrayHolder::getArr() const)[_sz] { return _arr; }
  58.  
  59. const ArrayHolder::_array_t& ArrayHolder::_getArr() const { return _arr; }
  60.  
  61. auto ArrayHolder::__getArr() const -> const int(&)[_sz] { return _arr; }
  62.  
  63. class VectorHolder {
  64. std::vector<int> _vec;
  65.  
  66. public:
  67. template<size_t N> VectorHolder(const int (&vec)[N]) {
  68. _vec.assign(std::begin(vec), std::end(vec));
  69. }
  70.  
  71. template<size_t N> VectorHolder(const std::array<int, N>& vec) {
  72. _vec.assign(std::begin(vec), std::end(vec));
  73. }
  74.  
  75. void out() {
  76. for (int i : _vec) {
  77. std::cout << i << std::endl;
  78. }
  79. }
  80.  
  81. std::vector<int>& getVec() { return _vec; }
  82. };
  83.  
  84. int main() {
  85. int a[3] = { 1, 2, 3 };
  86. std::array<int, 3> b = { 3, 2, 1 };
  87. ArrayHolder ah{a, b};
  88. ah.out();
  89. const int (&a_check)[3] = ah.getArr();
  90. const int (&a_check_2)[3] = ah._getArr();
  91. const int (&a_check_3)[3] = ah.__getArr();
  92. for (int i = 0; i < 3; i++) {
  93. if ((a[i] != a_check[i]) || (a[i] != a_check_2[i]) || (a[i] != a_check_3[i])) {
  94. std::cout << "Oops." << std::endl;
  95. } else {
  96. std::cout << "Huzzah!" << std::endl;
  97. }
  98. }
  99. std::array<int, 3> b_check = ah.getArr2();
  100. for (int i = 0; i < 3; i++) {
  101. if (b[i] != b_check[i]) {
  102. std::cout << ".spoO" << std::endl;
  103. } else {
  104. std::cout << "!hazzuH" << std::endl;
  105. }
  106. }
  107.  
  108.  
  109. // ---
  110.  
  111. int aa[2] = { 1, 2 };
  112. std::array<int, 1> bb = { 1 };
  113. ArrayHolder ai(aa, bb);
  114. ai.out();
  115.  
  116. // ---
  117.  
  118. std::cout << std::endl;
  119.  
  120. VectorHolder vh(a), vi(bb);
  121. vh.out();
  122. vi.out();
  123. std::vector<int> vh_check = vh.getVec();
  124. for (int i = 0; i < vh_check.size(); i++) {
  125. if (a[i] != vh_check[i]) {
  126. std::cout << "Voops." << std::endl;
  127. } else {
  128. std::cout << "Huzzah!" << std::endl;
  129. }
  130. }
  131. std::vector<int> vi_check = vi.getVec();
  132. for (int i = 0; i < vi_check.size(); i++) {
  133. if (bb[i] != vi_check[i]) {
  134. std::cout << ".spooV" << std::endl;
  135. } else {
  136. std::cout << "!hazzuH" << std::endl;
  137. }
  138. }
  139.  
  140. // ---
  141.  
  142. std::cout << std::endl;
  143. std::cout << typeid(ArrayHolder::_arr_t).name() << std::endl;
  144. std::cout << typeid(ArrayHolder::_array_t).name() << std::endl;
  145.  
  146. // ---
  147.  
  148. std::cout << std::endl;
  149. ArrayHolder haha(true, a);
  150. haha.out();
  151. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
1 3
2 2
3 1
Huzzah!
Huzzah!
Huzzah!
!hazzuH
!hazzuH
!hazzuH
1 1
2 9
9 9

1
2
3
1
Huzzah!
Huzzah!
Huzzah!
!hazzuH

A3_i
A3_i

1 121
2 121
3 121