Немного эксперементируя понял, что вроде бы код полностью работает:
template<int size>
void foo() {
int* a = new int[size];
for (int i = 0; i < size; ++i) {
a[i] = i + 1;
}
for (auto& i : (int(&)[size])(*a)) {
std::cout << i << " ";
}
std::cout << std::endl;
// Или
for (auto& i : reinterpret_cast<int(&)[size]>(*a)) {
std::cout << i << " ";
}
std::cout << std::endl;
delete[] a;
}
Но почему то есть небольшие сомнения, и в тоже время иногда хотелось бы использовать это
Например я реализовал вот такой многомерный массив с возможностью представления его плоским и тоже всё работает:
template<class T, size_t N, size_t ... SIZES>
struct Array : std::array<Array<T, SIZES ...>, N> {
static constexpr size_t size() {
return N;
}
static constexpr size_t total_size() {
return N * Array<T, SIZES ...>::total_size();
}
auto flat() -> T(&)[total_size()] {
return reinterpret_cast<T(&)[total_size()]>(*this);
}
auto flat() const -> const T(&)[total_size()] {
return reinterpret_cast<const T(&)[total_size()]>(*this);
}
};
template<class T, size_t N>
struct Array<T, N> : std::array<T, N> {
static constexpr size_t size() {
return N;
}
static constexpr size_t total_size() {
return N;
}
auto flat() -> T(&)[total_size()] {
return reinterpret_cast<T(&)[total_size()]>(*this);
}
auto flat() const -> const T(&)[total_size()] {
return reinterpret_cast<const T(&)[total_size()]>(*this);
}
};
int main() {
Array<int, 2,3> a {
1,2,3,
4,5,6
};
for (auto& line : a) {
for (auto& value : line) {
std::cout << value << " ";
}
std::cout << std::endl;
}
for (auto& value : a.flat()) {
std::cout << value << " ";
}
}
я тут полагался на то что std::array по идее внутри себя имеет только голый массив, и при такой рекурсивной реализации тоже получаются все элементы в одной области памяти находятся