Według standardu c++ tablice mogą być inicjalizowane jedynie(*) literałami znakowymi oraz listami inicjalizacyjnymi z klamerkami (brace-enclosed initializer list).
Inicjalizacja literałami znakowymi odpada z oczywistych względów.
Inicjalizacja listami inicjalizacyjnymi z klamerkami jest problematyczna, bo nie da się użyć szablonów do wygenerowania odpowiedniej listy. Jedyne rozwiązanie jakie przychodzi mi do głowy to użycie preprocesora
#define DUP2(x) x, x
#define DUP4(x) DUP2(x), DUP2(x)
#define DUP8(x) DUP4(x), DUP4(x)
#define DUP16(x) DUP8(x), DUP8(x)
#define DUP32(x) DUP16(x), DUP16(x)
#define DUP64(x) DUP32(x), DUP32(x)
#define DUP128(x) DUP64(x), DUP64(x)
#define DUP256(x) DUP128(x), DUP128(x)
#define DUP512(x) DUP256(x), DUP256(x)
// ...
#include <stdio.h>
int main(void) {
const int array[1000] = {
DUP512(10),
DUP256(10),
DUP128(10),
DUP64(10),
DUP32(10),
DUP8(10)
};
for (int i = 0; i < 1000; ++i) {
printf("%d\n", array[i]);
}
return 0;
}
Nie jest to najpiękniejsze rozwiązanie, ale jakoś działa. Na upartego dałoby się nawet generować stałe tablice trochę ogólniej: const T[N] = {f(0), f(1), ..., f(N)}; za pomocą preprocesora, ale to nie rozwiązuje wszystkich przypadków.
Anyway, nie widzę powodu aby chcieć robić takie rzeczy.
(*) Istnieje więcej możliwych inicjalizacji tablicy, ale w tym przypadku jedynie te dwie inicjalizacje mają jakiekolwiek znaczenie.