#include <iostream>
#include <type_traits>
// Array for reference. Unused except for grabbing type.
int array[5];
// Array's type. Type is: int (*)[5]
using A = decltype(array);
// Function that takes pointer-to-array as argument.
// Should use templates, really, or a typedef if array definition will never change.
int sum(int (*arr)[5]) {
int ret = 0;
for (int i = 0; i < 5; i++) { ret += (*arr)[i]; }
return ret;
}
// Function that takes reference-to-array as argument.
// Should use templates, really, or a typedef if array definition will never change.
int refsum(int (&arr)[5]) { return sum(&arr); }
// It's not that much cleaner, but templates help a lot here.
template<typename T, size_t N, typename TN = T[N]>
int temsum(T (*arr)[N]) {
static_assert(std::is_same<T, int>::value && (N == 5));
static_assert(std::is_same<TN*, A*>::value);
return sum(arr);
}
// Function that returns pointer-to-array.
// Looks awful.
int (*create())[5] {
// Don't do this outside of throwaway examples. ^_^
int (*arr)[5] = reinterpret_cast<int(*)[5]>(new int[5]);
for (int i = 1; i < 6; i++) { (*arr)[i - 1] = i * i; }
return arr;
}
// This is the only sane way to work with pointers-to-array, since a typedef uses normal syntax.
void destroy(A* arr) {
// Don't do this, either.
delete[] reinterpret_cast<int*>(arr);
}
int main() {
// Clean way to use pointer-to-array: Use the typedef.
A* arr = create();
int sum1 = sum(arr);
int sum2 = refsum(*arr);
int sum3 = temsum(arr);
std::cout << sum1 << ' ' << sum2 << ' ' << sum3 << '\n';
destroy(arr);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgovLyBBcnJheSBmb3IgcmVmZXJlbmNlLiAgVW51c2VkIGV4Y2VwdCBmb3IgZ3JhYmJpbmcgdHlwZS4KaW50IGFycmF5WzVdOwoKLy8gQXJyYXkncyB0eXBlLiAgVHlwZSBpczogaW50ICgqKVs1XQp1c2luZyBBID0gZGVjbHR5cGUoYXJyYXkpOwoKLy8gRnVuY3Rpb24gdGhhdCB0YWtlcyBwb2ludGVyLXRvLWFycmF5IGFzIGFyZ3VtZW50LgovLyBTaG91bGQgdXNlIHRlbXBsYXRlcywgcmVhbGx5LCBvciBhIHR5cGVkZWYgaWYgYXJyYXkgZGVmaW5pdGlvbiB3aWxsIG5ldmVyIGNoYW5nZS4KaW50IHN1bShpbnQgKCphcnIpWzVdKSB7CiAgICBpbnQgcmV0ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7IHJldCArPSAoKmFycilbaV07IH0KICAgIHJldHVybiByZXQ7Cn0KCi8vIEZ1bmN0aW9uIHRoYXQgdGFrZXMgcmVmZXJlbmNlLXRvLWFycmF5IGFzIGFyZ3VtZW50LgovLyBTaG91bGQgdXNlIHRlbXBsYXRlcywgcmVhbGx5LCBvciBhIHR5cGVkZWYgaWYgYXJyYXkgZGVmaW5pdGlvbiB3aWxsIG5ldmVyIGNoYW5nZS4KaW50IHJlZnN1bShpbnQgKCZhcnIpWzVdKSB7IHJldHVybiBzdW0oJmFycik7IH0KCi8vIEl0J3Mgbm90IHRoYXQgbXVjaCBjbGVhbmVyLCBidXQgdGVtcGxhdGVzIGhlbHAgYSBsb3QgaGVyZS4KdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4sIHR5cGVuYW1lIFROID0gVFtOXT4KaW50IHRlbXN1bShUICgqYXJyKVtOXSkgewoJc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VCwgaW50Pjo6dmFsdWUgJiYgKE4gPT0gNSkpOwoJc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VE4qLCBBKj46OnZhbHVlKTsKCXJldHVybiBzdW0oYXJyKTsKfQoKLy8gRnVuY3Rpb24gdGhhdCByZXR1cm5zIHBvaW50ZXItdG8tYXJyYXkuCi8vIExvb2tzIGF3ZnVsLgppbnQgKCpjcmVhdGUoKSlbNV0gewoJLy8gRG9uJ3QgZG8gdGhpcyBvdXRzaWRlIG9mIHRocm93YXdheSBleGFtcGxlcy4gXl9eCiAgICBpbnQgKCphcnIpWzVdID0gcmVpbnRlcnByZXRfY2FzdDxpbnQoKilbNV0+KG5ldyBpbnRbNV0pOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsgKCphcnIpW2kgLSAxXSA9IGkgKiBpOyB9CiAgICByZXR1cm4gYXJyOwp9CgovLyBUaGlzIGlzIHRoZSBvbmx5IHNhbmUgd2F5IHRvIHdvcmsgd2l0aCBwb2ludGVycy10by1hcnJheSwgc2luY2UgYSB0eXBlZGVmIHVzZXMgbm9ybWFsIHN5bnRheC4Kdm9pZCBkZXN0cm95KEEqIGFycikgewoJLy8gRG9uJ3QgZG8gdGhpcywgZWl0aGVyLgoJZGVsZXRlW10gcmVpbnRlcnByZXRfY2FzdDxpbnQqPihhcnIpOwp9CgppbnQgbWFpbigpIHsKCS8vIENsZWFuIHdheSB0byB1c2UgcG9pbnRlci10by1hcnJheTogVXNlIHRoZSB0eXBlZGVmLgogICAgQSogYXJyID0gY3JlYXRlKCk7CiAgICBpbnQgc3VtMSA9IHN1bShhcnIpOwogICAgaW50IHN1bTIgPSByZWZzdW0oKmFycik7CiAgICBpbnQgc3VtMyA9IHRlbXN1bShhcnIpOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgc3VtMSA8PCAnICcgPDwgc3VtMiA8PCAnICcgPDwgc3VtMyA8PCAnXG4nOwogICAgCiAgICBkZXN0cm95KGFycik7ICAgIAp9