https://issues.dlang.org/show_bug.cgi?id=5276
--- Comment #4 from bearophile_h...@eml.cc --- Updated D code, a little slower (?) but also nicer: template State(ulong Cols=0, ulong Diag135=0, ulong Diag45=0, ulong Solution=0) { enum ulong cols = Cols; enum ulong diag135 = Diag135; enum ulong diag45 = Diag45; enum ulong solution = Solution; } enum Test(int k, int j, alias state) = ((state.cols & (1UL << j)) + (state.diag135 & (1UL << (j + k))) + (state.diag45 & (1UL << (32 + j - k)))) == 0; alias Mark(int k, int j, alias state) = State!(state.cols ^ (1UL << j), state.diag135 ^ (1UL << (j + k)), state.diag45 ^ (1UL << (32 + j - k)), state.solution); template AccumulateResult(int startValue, int times, alias state) { static if (times == 0) alias AccumulateResult = state; else alias AccumulateResult = AccumulateResult!( startValue + 1, times - 1, State!(state.cols, state.diag135, state.diag45, state.solution + Test!(0, startValue, state))); } template ResultFromTest(bool condition, alias state, int current, int niv, int dx) { static if (condition == 0) alias ResultFromTest = state; else alias ResultFromTest = Mark!(niv, current, Solve!(niv - 1, dx, Mark!(niv, current, state))); } template ProcessQueens(int begin, int times, alias state, int niv, int dx) { static if (times == 0) alias ProcessQueens = state; else alias ProcessQueens = ProcessQueens!( begin + 1, times - 1, ResultFromTest!(Test!(niv, begin, state), state, begin, niv, dx), niv, dx); } template Solve(int niv, int dx, alias state=State!()) { static if (niv == 0) alias Solve = AccumulateResult!(0, dx, state); else alias Solve = ProcessQueens!(0, dx, state, niv, dx); } enum MetaNQueens(int dx) = Solve!(dx - 1, dx).solution; void main() { import core.stdc.stdio: printf; printf("%llu", MetaNQueens!7); } --