#include <iostream>
#include <algorithm>
#include <array>
#include <vector>
#include <type_traits>
#include <typeinfo>
const size_t _sz = 3;
class ArrayHolder {
int _arr[_sz];
std::array<int, _sz> _arr2;
public:
ArrayHolder(const int (&arr)[_sz], const std::array<int, 3>& arr2) : _arr2(arr2) {
std::copy(std::begin(arr), std::end(arr), std::begin(_arr));
}
template<size_t N1, size_t N2> ArrayHolder(const int (&arr)[N1], const std::array<int, N2>& arr2)
: ArrayHolder(std::integral_constant<bool, (N1 <= _sz) && (N2 <= _sz)>{}, arr, arr2) { }
template<size_t N> ArrayHolder(bool b, const int (&arr)[N]) {
std::copy(std::begin(arr), std::end(arr), std::begin(_arr));
std::fill(&(_arr[N]), std::end(_arr), 99);
_arr2.fill(121);
}
private:
template<size_t N1, size_t N2> ArrayHolder(std::true_type x, const int (&arr)[N1], const std::array<int, N2>& arr2) {
std::copy(std::begin(arr), std::end(arr), std::begin(_arr));
std::fill(&(_arr[N1]), std::end(_arr), 9);
std::copy(std::begin(arr2), std::end(arr2), std::begin(_arr2));
std::fill(&(_arr2[N2]), std::end(_arr2), 9);
}
public:
void out() {
for (int i = 0; i < 3; i++) {
std::cout << _arr[i] << " " << _arr2[i] << std::endl;
}
}
const int (&getArr() const)[_sz];
typedef int _array_t[_sz];
using _arr_t = decltype(_arr);
const _array_t& _getArr() const;
auto __getArr() const -> const int(&)[_sz];
const std::array<int, _sz>& getArr2() { return _arr2; }
};
const int (&ArrayHolder::getArr() const)[_sz] { return _arr; }
const ArrayHolder::_array_t& ArrayHolder::_getArr() const { return _arr; }
auto ArrayHolder::__getArr() const -> const int(&)[_sz] { return _arr; }
class VectorHolder {
std::vector<int> _vec;
public:
template<size_t N> VectorHolder(const int (&vec)[N]) {
_vec.assign(std::begin(vec), std::end(vec));
}
template<size_t N> VectorHolder(const std::array<int, N>& vec) {
_vec.assign(std::begin(vec), std::end(vec));
}
void out() {
for (int i : _vec) {
std::cout << i << std::endl;
}
}
std::vector<int>& getVec() { return _vec; }
};
int main() {
int a[3] = { 1, 2, 3 };
std::array<int, 3> b = { 3, 2, 1 };
ArrayHolder ah{a, b};
ah.out();
const int (&a_check)[3] = ah.getArr();
const int (&a_check_2)[3] = ah._getArr();
const int (&a_check_3)[3] = ah.__getArr();
for (int i = 0; i < 3; i++) {
if ((a[i] != a_check[i]) || (a[i] != a_check_2[i]) || (a[i] != a_check_3[i])) {
std::cout << "Oops." << std::endl;
} else {
std::cout << "Huzzah!" << std::endl;
}
}
std::array<int, 3> b_check = ah.getArr2();
for (int i = 0; i < 3; i++) {
if (b[i] != b_check[i]) {
std::cout << ".spoO" << std::endl;
} else {
std::cout << "!hazzuH" << std::endl;
}
}
// ---
int aa[2] = { 1, 2 };
std::array<int, 1> bb = { 1 };
ArrayHolder ai(aa, bb);
ai.out();
// ---
std::cout << std::endl;
VectorHolder vh(a), vi(bb);
vh.out();
vi.out();
std::vector<int> vh_check = vh.getVec();
for (int i = 0; i < vh_check.size(); i++) {
if (a[i] != vh_check[i]) {
std::cout << "Voops." << std::endl;
} else {
std::cout << "Huzzah!" << std::endl;
}
}
std::vector<int> vi_check = vi.getVec();
for (int i = 0; i < vi_check.size(); i++) {
if (bb[i] != vi_check[i]) {
std::cout << ".spooV" << std::endl;
} else {
std::cout << "!hazzuH" << std::endl;
}
}
// ---
std::cout << std::endl;
std::cout << typeid(ArrayHolder::_arr_t).name() << std::endl;
std::cout << typeid(ArrayHolder::_array_t).name() << std::endl;
// ---
std::cout << std::endl;
ArrayHolder haha(true, a);
haha.out();
}