You could do something like this:
Code:
#include <iostream>
#include <string>
template<typename T, std::size_t N>
struct arrayout_obj {
const T (&arr)[N];
const char *sep;
arrayout_obj(const T (&arr)[N], const char *sep) : arr(arr), sep(sep) {}
};
template<typename T, std::size_t N>
auto arrayout(const T (&arr)[N], const char *sep = ", ") {
return arrayout_obj<T,N>(arr, sep);
}
template<typename T, std::size_t N>
std::ostream& operator<<(std::ostream& os, const arrayout_obj<T,N>& ap) {
for (std::size_t i = 0; i < N; ++i) {
if (i > 0) os << ap.sep;
os << ap.arr[i];
}
return os;
}
int main() {
int n[] = { 1,2,3,4,5,6,7,8,9,10 };
std::string s[] = { "Mercury", "Venus", "Earth", "Mars" };
std::cout << arrayout(n) << '\n';
std::cout << arrayout(s, "\n");
}