#include <iostream>
#include <vector>
#include <type_traits>

using namespace std;

template <typename T>
struct NaiveVector {
  vector<T> v;
  NaiveVector(size_t num, const T &val) : v(num, val) {
    cout << "(int num, const T &val)" << endl;
  }

  template
  <
    typename InputIterator
  , typename = typename ::std::enable_if
    <
      ::std::is_same
      <
        T &
      , typename ::std::remove_const
        <
          decltype(*(::std::declval< InputIterator >()))
        >::type
      >::value
    ,  void
    >::type
  >
  NaiveVector(InputIterator first, InputIterator last) : v(first, last) {
    cout << "(InputIterator first, InputIterator last)" << endl;
  }

  size_t size() const { return v.size(); }
};

int main() {
  NaiveVector<int> myVec1(5,1);
  cout << "size = " << myVec1.size() << endl;
  for (auto n : myVec1.v) { cout << n << " "; }
  cout << endl;

  cout << "-----" << endl;

  vector<int> vec({1,2,3,4,5});
  NaiveVector<int> myVec2(vec.begin(), vec.end());
  cout << "size = " << myVec2.size() << endl;
  for (auto n : myVec2.v) { cout << n << " "; }
  cout << endl;
}