import std.stdio ; // directly assign a constant struct R { float[3][3] x = [[0.0F, 0.0F, 0.0F],[0.0F, 0.0F, 0.0F],[0.0F, 0.0F, 0.0F]] ; } // use template template ZH(int M, T, T value) { static if (M == 1) const T[M] ZH= [value] ; else const T[M] ZH= cast(T[M])(ZH!(M - 1, T, value) ~ value) ; } template ZV(alias zh, int N) { static if (N == 1) const typeof(zh)[N] ZV = [zh]; else const typeof(zh)[N] ZV = cast(typeof(zh)[N])(ZV!(zh, N - 1) ~ zh) ; } template Zero(int M, int N, T, T value) { const float[M][N] Zero = ZV!(ZH!(M, T, value), N); } struct S { float[4][3] x = Zero!(4,3, float, 0.0F); } void main() { S s ; R r ; writefln("%s", s ) ; writefln("%s", r ) ; } // output : // S([[0 0 0 0] [0 0 0 0] [0 0 0 0]]) // R([[0 0 0] [0 0 0] [0 0 0]])