#include <iostream>
#include <initializer_list>
namespace x {
template <typename T>
struct s {
private:
T * elem = nullptr;
int size;
public:
s(std::initializer_list<T> l) : elem{ new T[l.size()] }, size{ l.size() }{
std::copy(l.begin(), l.end(), elem);
}
s(const s & _s);
size_t getSize() const { return size; }
T & operator [] (int i);
};
template <typename T>
T & s<T>::operator[](int i) {
if (i < 0)
throw "Negative value not allowed.";
return elem[i];
}
template <typename T>
s<T>::s(const s & _s) : elem{ new T[size] }, size{ _s.size } {
for (int x = 0; x < size; ++x)
elem[x] = _s.elem[x];
}
}
template<typename T>
T* begin(x::s<T>& m)
{
return m.size() ? &m[0] : nullptr; // pointer to first element or nullptr
}
template<typename T>
T* end(x::s<T>& m)
{
return begin(m)+m.size(); // pointer to one-past-last element
}
template <typename C, typename V>
V sum(const C & c, V v) {
for (auto a : c)
v += a;
return v;
}
int main() {
x::s<int> s0{ 2, 3, 5, 7 };
int a = sum(s0, 0);
return 0;
}