В Си++ нет понятия «произвольный массив», и это мешает.
Но несложно этот самый произвольный массив (без хранения) написать
template <class T>
struct Buf1d {
size_t size;
T* d;
constexpr Buf1d() : size(0), d(nullptr) {}
constexpr Buf1d(size_t aSize, T* aD) : size(aSize), d(aD) {}
Buf1d(std::vector<T>& x) : size(x.size()), d(x.data()) {}
}
И этому Buf1d можно придумать и другие функции, например:
template <class T>
Buf1d<T> Buf1d<T>::sliceLeft(size_t x) const
{
if (x >= size) {
return {};
} else {
return { size - x, d + x };
}
}
Если же вам нужно с хранением, то, например, можно воспользоваться старым добрым vector.
template<class T>
std::vector<T> sliceLeft(const std::vector<T>& v, size_t x)
{
if (x >= v.size()) {
return {};
} else {
std::vector<T> r;
r.insert(r.end(); v.begin() + x, v.end());
return r;
}
}