#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);
T * begin();
T * end();
};
template <typename T>
T * s<T>::begin() {
return &elem[0];
}
template <typename T>
T * s<T>::end() {
return begin() + size;
}
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 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;
}